gpt4 book ai didi

java - Gradle idea插件排除了其他子项目的传递依赖不排除

转载 作者:行者123 更新时间:2023-12-01 05:41:19 27 4
gpt4 key购买 nike

我有一个具有以下依赖结构的 gradle 项目:

root
+--- module1
| \--- 'some:dependency:1.0' (Maven dependency)
| \--- 'some:transitive:2.1' (transitive dep)
\--- module2
+--- module1
+--- exclude 'some:transitive:2.1'
\--- 'some:other:1.0'
\--- 'other:transitive:1.1'

基本上 module2 排除了依赖项 some:transitive:2.1(对于 module1 是可传递的)。这是因为它在运行时与 other:transitive:1.1 冲突(我可以提供我正在谈论的确切库,但这与我的问题无关)并且组 ID 和工件 ID 不同,所以它必须手动排除:

configurations.all {
exclude group: 'some', module: 'transitive', version: '2.1'
}

依赖项已正确排除(我可以通过执行 dependencyInsight 任务来判断)。如果我在 module2 中创建一个测试,它使用来自 some:other:1.0 的代码,这将触发运行时冲突,它会使用 Gradle 成功运行,因为 jar 被排除在外:

gradle :module2:test -Dtest.single=SomeTest

现在我正在使用 IntelliJ 12(Gradle 集成太差),我使用 Gradle idea 插件生成 .ipr 和 .iml 文件。一切正常。

但是,如果我从 IDE 运行 SomeTest,我将得到由上述冲突触发的运行时冲突。查看 IDE 测试类路径,我发现它实际上包含(除其他外)排除的 jar:

-classpath ...:/path/to/jar/some/transitive/2.1/some-transitive-2.1.jar:...

所以我的问题是:如何防止 IntelliJ 在不应该的情况下添加这种传递依赖?

为了完整起见,这里是我正在谈论的冲突(尽管它与本次讨论无关):

java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:875)
at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:840)
at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:755)
at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1171)
at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1144)
at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1140)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:299)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:272)
at org.glassfish.jersey.test.JerseyTest.<init>(JerseyTest.java:142)
at com.mypackage.rest.SomeTest.<init>(RestServiceTest.java:19)

这是由 Jersey 和 ASM 4.1(Jersey 使用具有不同组 ID 的 3.3.1)之间的不兼容引起的,这是从另一个模块中提取的传递依赖。

顺便说一下,我知道 IDEA 13 有更好的 Gradle 集成,但是 (a) 我们有 12 的许可证并且不会很快升级整个开发团队,并且 (b) IDEA 13 仍然有一些多语言问题Gradle 项目 (Java/Scala),因此不符合要求。

最佳答案

排除 Maven 依赖的所有传递依赖,但显式添加所有必需的库。除了“some:transitive:2.1”之外,我假设您可以在没有它的情况下运行您的代码。

group:'some', name:'dependency', version:'1.0' {
transitive = false
}
// add required transitive libraries here

此外,尝试使用最新版本的 Gradle 运行您的原始代码。

关于java - Gradle idea插件排除了其他子项目的传递依赖不排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com