我有以下依賴結構的項目的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 –