2014-02-10 68 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 –