2014-02-10 70 views
3

我有以下依赖结构的项目的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),所以它不适合账单。

回答

0

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

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

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

+0

不幸的是,我不再使用Gradle,如果有人能证实这个作品,我会接受。谢谢! –

+0

这是行不通的,我刚刚使用Gradle 2.3和Intellij IDEA 14.1.2与OP –