2014-02-10 2 views
3

У меня есть Gradle проект со следующей структурой зависимостей: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 отличается, поэтому он должен быть вручную исключен:

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

Зависимость правильно исключена (я могу сказать, выполнив задание dependencyInsight). И если я создаю тест в module2, который использует код из some:other:1.0, который будет запускать во время выполнения конфликта, он будет запущен успешно использует Gradle, потому что банка исключается:

gradle :module2:test -Dtest.single=SomeTest 

Теперь я использую IntelliJ 12 (так слабая интеграцию Gradle), и я генерирую файлы .ipr и .iml, используя плагин Gradle idea. Все работает очень хорошо.

Однако, если я запустил SomeTest из IDE, я получу конфликт времени выполнения, вызванный упомянутым выше столкновением. Глядя на тест IDE пути к классам я вижу, что он на самом деле содержит (помимо прочего) исключенная баночку:

-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, который имеет другую идентификатор группы), которая является транзитивной зависимостью, выведенной из другого модуля.

Кстати, я знаю, что IDEA 13 имеет гораздо лучшую интеграцию Gradle, но (а) у нас есть лицензия на 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

К сожалению, я больше не использую Грейдл, если кто-нибудь сможет подтвердить это, я согласен. Благодаря! –

+0

Это не работает, я только что проверил с Gradle 2.3 и Intellij IDEA 14.1.2 в аналогичной настройке, как OP –

Смежные вопросы