我有以下依赖结构的项目的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 :module2:test -Dtest.single=SomeTest
现在我使用的IntelliJ 12(好可怜摇篮整合),并使用Gradle idea
插件生成.ipr和.iml文件。一切工作都很好。
但是,如果我从IDE运行SomeTest
,我将得到由上述冲突触发的运行时冲突。纵观IDE测试classpath中我看到,它实际上包含了(其中包括)该排除的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)
这是由新泽西州和ASM 4.1(新泽西州之间的不兼容引起的使用3.3.1这有一个不同的组ID),这是从另一个模块拉取的传递依赖。顺便说一句,我知道IDEA 13有更好的Gradle集成,但(a)我们有一个12的许可,而不是很快升级整个开发团队,(b)IDEA 13仍然存在一些问题polyglot Gradle项目(Java/Scala),所以它不适合账单。
不幸的是,我不再使用Gradle,如果有人能证实这个作品,我会接受。谢谢! –
这是行不通的,我刚刚使用Gradle 2.3和Intellij IDEA 14.1.2与OP –