在JRE容器之前使用Spring Gradle依赖项容器会导致编译错误

时间:2016-02-25 01:53:07

标签: java eclipse gradle sts-springsourcetoolsuite gradle-eclipse

我正在将一个Java项目从Ant转换为Gradle。我们团队的首选IDE是Eclipse。我已经为Eclipse安装了Spring Gradle插件,应用了Gradle项目的性质并启用了依赖关系管理。结果是一些编译错误。

发生编译错误是因为Gradle依赖项容器位于eclipse类路径中的JRE容器之前。类路径上的一些jar包含应该来自rt.jar的类(并且它们与我们的代码不兼容,可能是旧版本)。

当禁用依赖关系管理时,gradle依赖关系位于JRE容器之后,并且编译时没有错误。这也与我使用Eclipse / Maven / m2e一致,其中Maven依赖容器位于eclipse中的JRE容器之后。

这是插件的默认行为(将gradle容器放在JRE之前)吗?有没有办法改变它?

我尝试使用eclipse挂钩(whenMerged和withXml)在我的build.gradle中执行此操作,但这些似乎在使用容器条目替换gradle依赖项之前执行。

2 个答案:

答案 0 :(得分:2)

对订单有一些控制但对你来说可能不够精确。右键单击项目,然后选择'属性>>摇篮'

然后选择其中一个排序选项,例如'按字母顺序按路径'。更改此选项后,执行" Gradle>>全部刷新"。

如果您选择"由BuildScript"我收集的必须是你拥有的。订单将被撤销(JRE之前的Gradle)。这里有一个难题,即buildscript实际上并没有返回" gradle依赖关系"容器(仅限其内容),因此构建脚本并未真正定义顺序。

不幸的是,您可能有理由选择该选项并对容器内的依赖项进行排序实际上可能不适合您。

如果是这样,你可以尝试第二件事。

导入项目时,导入向导a"运行后"在"导入选项"。您可能会尝试使用在那里指定的任务来修改导入结束时的.classpath文件(它也将在刷新时执行)。

最后......最后一个建议。你试过BuildShip吗?也许它对您的项目更有效。

答案 1 :(得分:1)

这是我交换容器的代码。由于几个原因,它可能有点冗长。 1.我是来自Java背景的Groovy新手。 Gradle对我自己和团队来说都是新手,我想清楚它在做什么。

// Swap the order of the JRE and classpathcontainer
// https://issuetracker.springsource.com/browse/STS-4332
task afterEclipseImport(description: "Post processing after project generation", group: "IDE") {
    doLast {
        def cp = new XmlParser().parse(file(".classpath"))
        def container
        def cons = cp.classpathentry.findAll { it.@kind == "con" }
        cons.find {
            if (it.@path.equals("org.springsource.ide.eclipse.gradle.classpathcontainer")) {
                println "found Gradle dependency container"
                container = it
            } else if (it.@path.contains("JRE_CONTAINER")) {
                if (container == null) {
                    println "found JRE container before Gradle dependency container, nothing to do"
                    // Return true to end the loop (return by itself is not enough)
                    return true
                }
                println "found JRE container, swap with Gradle dependency container"
                container.replaceNode(it)
                it.replaceNode(container)
                // Return true to end the loop (return by itself is not enough)
                return true
            }
            return false
        }
        def builder = new StreamingMarkupBuilder()
        builder.encoding = "UTF-8"
        file(".classpath").withWriter {writer ->
             writer << builder.bind { mkp.xmlDeclaration() }
             def printer = new XmlNodePrinter(new PrintWriter(writer))
             // println cp
             printer.print(cp)
        }
    }
}