簡體   English   中英

Gradle idea插件排除了未排除的其他子項目的傳遞依賴性

[英]Gradle idea plugin excluded transitive dependency from other sub-project not excluded

我有一個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依賴some:transitive:2.1 (對於module1是傳遞的)。 這是因為它在運行時與other:transitive:1.1沖突other:transitive:1.1 (我可以提供我正在討論的確切庫但它與我的問題無關)並且組ID和工件ID是不同的,因此必須手動排除:

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

正確排除了dependencyInsight (我可以通過執行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使用3.3.1,它具有不同的組ID)之間的不兼容性引起的,這是從另一個模塊中提取的傳遞依賴。

順便說一下,我知道IDEA 13有更好的Gradle集成,但是(a)我們有12個許可證,而不是很快升級整個開發團隊。(b)IDEA 13仍然有一些問題與polyglot Gradle項目( Java / Scala),所以它不符合要求。

排除Maven依賴項的所有傳遞依賴項,但顯式添加所有必需的庫。 除了'some:transitive:2.1'之外,我假設您可以在沒有它的情況下運行代碼。

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

此外,嘗試使用最新版本的Gradle運行原始代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM