4

尝试使用 intelliJ 为 java 编译 flamingo 图形工具时出现此错误。

这是错误项目的 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
      }
    }
  }
}

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

该项目在 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'
}

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

4

1 回答 1

4

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

更准确地说,IDE Gradle 插件使用 Gradle Tooling API 与 Gradle 构建进行交互(运行它,获取有关源路径、依赖项、任务等的信息)。IDE 插件中使用的 Tooling API 的当前版本与低至 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' }到您的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.0 也不行。由于 1.0-milestone-2 只是一个预发布版本,因此稳定性保证当然还没有成立,并且与 1.0 之间的更改会破坏您的构建。

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

关于第二个错误,Exceptions IntelliJ 正在抱怨。我的根本没有抱怨,我不知道您可能启用了哪些检查或其他什么,但是如果 Gradle 可以,那么 IntelliJ 应该可以,如果不是,您应该将其作为错误报告给 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) {}

例如可以写成

if (project.hasProperty('pgpSecretKeyRingFile')) {
  apply plugin: 'sign'
  apply plugin: de.huxhorn.gradle.pgp.PgpPlugin
}

try {
  def x = [deployUsername, deployPassword]
} catch (Exception e) {
  deployUsername = 'unset'
  deployPassword = ''
}

例如可以写成

if (!(project.hasProperty('deployUsername') && project.hasProperty('deployPassword'))) {
  deployUsername = 'unset'
  deployPassword = ''
}

在不改变代码含义的情况下

于 2017-12-14T03:11:02.887 回答