groovy.lang.MissingPropertyException:无法为 org.gradle.api.Project 类型的项目“:flamingo”设置未知属性“versionKey”

lol*_*ley 6 java swing gradle radiance-flamingo

我在尝试使用 intelliJ 编译 java 火烈鸟图形工具时遇到此错误。

这是错误项目的 build.gradle 文件:

import javax.swing.SwingUtilities

dependencies {
  compile project(":trident")
  compile group: 'org.tmatesoft.svnkit', name: 'svnkit', version:'1.2.3.5521'
  compile group:'org.apache.xmlgraphics', name:'batik-swing', version:'1.7'
  compile (group:'org.apache.xmlgraphics', name:'batik-transcoder', version:'1.7') {
    exclude group:'xml-apis'
    exclude group:'xalan'
    exclude group:'commons-io'
    exclude group:'commons-logging'
    exclude group:'org.apache.avalon.framework'
  }
  testCompile group: 'com.jgoodies', name: 'forms', version: '1.2.0'
  testCompile group: 'junit', name: 'junit', version: '4.3.1'
  testCompile group: 'org.easytesting', name: 'fest-assert', version: '1.2'
  testCompile group: 'org.easytesting', name: 'fest-reflect', version: '1.2'
  testCompile group: 'org.easytesting', name: 'fest-swing', version: '1.2.1'
  testCompile group: 'org.easytesting', name: 'fest-swing-junit', version: '1.2.1'
  testCompile group: 'org.easytesting', name: 'fest-swing-junit-4.3.1', version: '1.2.1'
}

sourceSets {
  main
  test
}

test {
  // if we are headless, don't run our tests
  enabled = !Boolean.getBoolean("java.awt.headless")
}

jar {
  manifest {
    attributes(
        "Flamingo-Version": version,
        "Flamingo-VersionName": versionKey,
    )
  }
}

task testJar(type: Jar) {
  classifier = 'tst'

  from sourceSets.test.classes

  manifest {
    attributes(
        "Flamingo-Version": version,
        "Flamingo-VersionName": versionKey,
    )
  }
}

uploadArchives {
  try {
    def x = [deployUsername, deployPassword]
  } catch (Exception e) {
    deployUsername = 'unset'
    deployPassword = ''
  }
  repositories {
    mavenDeployer {
      snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
        authentication userName: deployUsername, password: deployPassword
      }
      repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
        authentication userName: deployUsername, password: deployPassword
      }
      configurePOM(pom)
    }
  }
}

install {
  configurePOM(repositories.mavenInstaller.pom)
}

private def configurePOM(def pom) {
  configureBasePom(pom)
  pom.project {
    name "flamingo"
    description "A fork of @kirilcool's flamingo project"
    url "http://insubstantial.github.com/peacock"
  }
  // deal with a gradle bug where transitive=false is not passed into the generated POM
  pom.whenConfigured {cpom ->
    cpom.dependencies.each {it
      switch (it.artifactId) {
        case 'trident':
          it.classifier = 'swing'
          break
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道要为版本密钥添加什么,也不知道在哪里添加。

该项目位于 GitHub 上:它是原始项目 flamingo 的一个分支

这是根目录中的 build.gradle 文件:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'de.huxhorn.gradle:de.huxhorn.gradle.pgp-plugin:0.0.3'
    }
}

subprojects {
  apply plugin: 'java'
  apply plugin: 'maven'
  try {
    def test = pgpSecretKeyRingFile // exception will throw if not set
    apply plugin: 'sign'
    apply plugin: de.huxhorn.gradle.pgp.PgpPlugin
  } catch (Exception ignore) {}

  group = 'com.github.insubstantial'
  version = '6.3-SNAPSHOT'
  versionKey = "6.3-defender"
  release = "internal"

  sourceCompatibility = 1.6
  targetCompatibility = 1.6

  configurations {
    maven { extendsFrom archives }
  }

  repositories {
    mavenRepo urls: 'https://oss.sonatype.org/content/groups/staging'
    mavenCentral()
    mavenRepo urls: new File(System.getProperty('user.home'), '.m2/repository').toURI().toString()
  }

  task sourceJar(type: Jar) {
    from sourceSets.main.java
    from sourceSets.main.resources
    classifier = 'sources'
  }

  task javadocJar(type: Jar) {
    dependsOn javadoc
    from javadoc.destinationDir
    classifier = 'javadoc'
  }

  artifacts {
    maven sourceJar
    maven javadocJar
  }

  uploadArchives {
    try {
      def x = [deployUsername, deployPassword]
    } catch (Exception e) {
      deployUsername = 'unset'
      deployPassword = ''
    }
    configuration = configurations.maven
    repositories {
      mavenDeployer {
        snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
          authentication userName: deployUsername, password: deployPassword
        }
        repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
          authentication userName: deployUsername, password: deployPassword
        }
      }
    }
  }

  install {
    configuration = configurations.maven
  }

  configureBasePom = { pom ->
    pom.project {
      modelVersion '4.0.0'
      packaging 'jar'
      scm {
        connection 'scm:git:git@github.com:Insubstantial/insubstantial.git'
        developerConnection 'scm:git:git@github.com:Insubstantial/insubstantial.git'
        url 'scm:git:git@github.com:Insubstantial/insubstantial.git'
      }
      developers {
        developer {
          name 'Kirill Grouchnikov'
          email 'kirillcool@yahoo.com'
          roles {
            role 'author'
            role 'developer'
          }
        }
        developer {
          name 'Danno Ferrin'
          email 'danno.ferrin@shemnon.com'
          roles {
            role 'maintainer'
          }
        }
      }
    }
  }
}

task wrapper(type: Wrapper) {
  gradleVersion = '1.0-milestone-2'
}
Run Code Online (Sandbox Code Playgroud)

此外,主 build.gradle 包含单词“Exception”,这会引发 intelliJ 错误。

Vam*_*ire 5

好吧,你的主要问题是 - 这两个都是有效的陈述,你可以自己选择你认为更有吸引力的 - 该项目是为太旧的 Gradle 版本设计的,无法与当前的 Gradle 集成和/或你的 IntelliJ 版本一起使用(或者更确切地说,它的 Gradle 集成)对于该项目的使用来说太新了。

从技术上更准确地说,IDE Gradle 插件使用 Gradle Tooling API 与 Gradle 构建进行交互(运行它,获取有关源路径、依赖项、任务等的信息)。IDE 插件中使用的工具 API 的当前版本与 Gradle 1.2 的版本兼容,而 Gradle 1.2 已经非常古老了。不过,您的构建是为与 Gradle 1.0-milestone-2 一起运行而设计的 - 这甚至不是一个高效的版本 - 并在其 Gradle 包装器设置中定义了这一点。

这意味着,如果您从命令行运行 Gradle,则会自动使用 1.0-milestone-2 并且构建将按设计运行(这就是包装器的神奇魔力)。如果您尝试使用 IntelliJ 的 Gradle 集成导入项目并告诉它使用项目默认包装器(默认选择并且始终是最好的想法,如果项目不使用包装器,请告诉他们添加它),IntelliJ 会告诉你The project is using an unsupported version of Gradle. Please point to a supported Gradle version in the project's Gradle settings or in the project's Gradle wrapper (if applicable.)。我猜您随后放弃了消息对话框并告诉 IntelliJ 使用一些本地 Gradle 安装,然后您收到了您提到的错误。(顺便说一句,你应该提到你遵循了这种方式,让帮助变得更容易)

当 Gradle 版本中存在主要版本冲突时,他们会根据其弃用和删除政策删除之前已弃用的内容,并且构建可能会因这些更改而中断,这正是您所展示的,因为您使用此构建的 Gradle 版本并非专为且不兼容。

所以你能做的有两件事。

您可以不在该项目中使用 IntelliJ 中的 Gradle 集成,而是仅从命令行使用 Gradle。您可以添加allprojects { apply plugin: 'idea' }到您的IntelliJ 项目文件build.gradle,然后用于./gradlew idea生成正确配置的 IntelliJ 项目文件,然后您可以使用 IntelliJ 打开该项目文件并使用该项目。

另一个选择 - 我真的会推荐它,即使它需要更多的工作 - 是更新构建以与当前 Gradle 版本兼容并配置包装器以使用该新版本,然后集成可以完美地工作,您也可以从中受益自旧版本以来,所有开发都是在 Gradle 中完成的。您可以阅读发行说明以了解重要更改、重大更改和有趣的更改。要完成它,还应该足以更新到最新的 1.x 版本,修复所有已弃用的警告,更新到最新的 2.x 版本,修复所有已弃用的警告,更新到最新的 3.x 版本,修复所有已弃用的警告,然后更新到最新的 4.x 版本。这至少应该使构建能够以一种引导的方式使用最新版本,即使构建可能不是最好的,而不是使用同时添加到 Gradle 的一些新东西。但这至少可以作为一个入门。

您可能会想,您也可以做一个中间的事情,只需将包装器设置为使用 1.2。由于它处于相同的主要版本中,因此构建应该可以使用它,并且正如我之前所说,1.2 是目前正在使用集成的最旧版本。至少部分如此。例如,取消构建之类的操作将不起作用,因为 1.2 尚不支持此功能,即使工具 API 支持也是如此。但这是行不通的,因为即使是 1.0 版本也无法构建。由于 1.0-milestone-2 只是预发布版本,因此稳定性保证当然尚未实现,并且 1.0 与 1.0 之间的更改会破坏您的构建。

关于您实际遇到的两个错误,第一个,具有未知属性的错误正是我提到的重大更改之一。以前,您可以通过执行以下操作简单地设置任何新属性foo = 'value'。问题是,人们经常错误地输入属性,例如fop = 'value'改为写入,然后想知道为什么它不起作用,却没有得到任何有用的错误消息。因此,动态定义的属性是被禁止的,您必须在ext命名空间中执行此操作,例如ext { foo = 'value' }or ext.foo = 'value',但仅限于第一次出现。这定义了新的自定义属性,稍后您只能通过其名称来获取和设置它。如果它首先不应该是所讨论的对象(您的情况下的项目)的属性,而只是构建脚本中的局部变量,那么它应该简单地定义为局部变量,就像def foo = 'value'在 Groovy 中一样Gradle 是基于 .

关于第二个错误,ExceptionIntelliJ 正在抱怨。我的完全没有抱怨,我不知道你可能启用了哪些检查或其他什么,但如果 Gradle 没问题,那么 IntelliJ 应该没问题,如果不是,你应该将其作为 bug 报告给 JetBrains,但作为我说,这里不是红色的。但是,像在构建脚本中那样使用异常进行流程控制无论如何都是非常糟糕的做法,不仅在构建脚本中,而且在 Java 中甚至在编程中也是如此。

try {
  def test = pgpSecretKeyRingFile // exception will throw if not set
  apply plugin: 'sign'
  apply plugin: de.huxhorn.gradle.pgp.PgpPlugin
} catch (Exception ignore) {}
Run Code Online (Sandbox Code Playgroud)

例如可以写成

if (project.hasProperty('pgpSecretKeyRingFile')) {
  apply plugin: 'sign'
  apply plugin: de.huxhorn.gradle.pgp.PgpPlugin
}
Run Code Online (Sandbox Code Playgroud)

try {
  def x = [deployUsername, deployPassword]
} catch (Exception e) {
  deployUsername = 'unset'
  deployPassword = ''
}
Run Code Online (Sandbox Code Playgroud)

例如可以写成

if (!(project.hasProperty('deployUsername') && project.hasProperty('deployPassword'))) {
  deployUsername = 'unset'
  deployPassword = ''
}
Run Code Online (Sandbox Code Playgroud)

不改变代码的含义