当前位置: 首页 > 知识库问答 >
问题:

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

华永新
2023-03-14

我正在将一个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 之前)吗?有没有办法改变它?

我试图在我的build.gradle中使用eclipse钩子(whenMerged和withXml)来实现这一点,但这些钩子似乎是在gradle依赖项被容器条目替换之前执行的。

共有2个答案

黄俊智
2023-03-14

这是我交换容器的代码。这可能有点冗长,原因有几个。1.我是Groovy的新手,来自Java背景。2.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)
        }
    }
}
徐智渊
2023-03-14

对订单有一些控制,但对您来说可能不够精确。右键单击项目并选择“属性”

然后选择一个排序选项,如“按路径字母顺序”。更改此选项后,请执行“Gradle

如果您选择“由BuildScript返回”,我想这一定是您所拥有的。顺序将被颠倒(JRE之前的Gradle)。这里有一个难题,即构建脚本实际上并没有返回“gradle依赖项”容器(仅返回其内容),因此构建脚本并没有真正定义顺序。

不幸的是,您可能有理由选择该选项,并且对容器内的依赖项进行排序实际上可能不是一个可行的解决方案。

如果是这样,您可能还可以尝试第二件事。

导入项目时,导入向导会在“导入选项”下显示“运行时间”。您可以尝试在导入结束时使用指定的任务来修改.classpath文件(它也将在刷新时执行)。

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

 类似资料:
  • 我有一个docker-compose文件,如下所示,它有两个容器。一个是MySQL DB,另一个是读/写DB的Python爬虫应用程序。当我执行时,我看到: 已生成DB容器 然后生成应用程序容器 然后运行应用程序容器上的CMD(例如启动我的爬网程序) 然后根据docker-compose文件中的环境变量在DB容器中初始化我的数据库。 我的问题是为什么我的爬虫脚本在我的数据库在DB容器中创建之前运行

  • 当我试图在Docker容器内使用Java Spring中的WebClient连接到REST服务时,我遇到了一个错误。我在想有没有人能告诉我问题出在哪里? DockerFile:

  • 容器和依赖注入 5.1版本正式引入了容器的概念,用来更方便的管理类依赖及运行依赖注入。 5.0版本已经支持依赖注入的,依赖注入和容器没有必然关系 容器类的工作由think\Container类完成,但大多数情况我们只需要通过app助手函数即可完成大部分操作。 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于

  • 我在编译顺序时遇到编译器错误。java文件,即使它包含另一个打包类的导入语句。我不完全确定为什么会发生这种情况,但这是一个目录树,其中包含一些文件: > com/my/domain/Order.java 这个文件里面有下面的包和导入: com/my/utils/MyDate。此文件中包含以下包和导入: 编译顺序时出现编译器错误。java: 我仍然不知道如何解决这个问题后,试图从评论。这里有一些更多

  • 以下代码: 给出编译器错误: 此行有多个标记-类型列表中的方法add(capture#1-of?extends String)不适用于参数(String)-方法add(capture#1-of?)类型列表中的不适用于参数(字符串) 是什么导致了这个错误?我应该不能添加Strings或它的子类型,因为我正在类型参数中扩展String吗?

  • 我使用比较器对流进行排序,遇到了一个我不理解的编译器错误。 假设我有以下课程: 我正在创建两个比较器,以按日期对s进行排序,一个按自然顺序,另一个按相反顺序。编译以下代码: 意识到是在上定义的,我想我会尝试以下操作: (对我来说)令人惊讶的是,rev2的代码编译正常,而rev1的代码产生以下错误: 为什么我会收到这些编译器错误?为什么我可以在从构建时有效地规避它们? (如果相关的话,我正在使用Ec

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象。 Martin 的文章 已经解释了 DI 容器为什么很有用。 这里我们主要讲解 Yii 提供的 DI 容器的使用方法。 依赖注入(Dependency Injection) Yii 通过 yii\di\Container 类提供 DI 容器特性。 它支持如下几种类型的依赖注入: