У меня есть 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), поэтому он не будет соответствовать законопроекту.
К сожалению, я больше не использую Грейдл, если кто-нибудь сможет подтвердить это, я согласен. Благодаря! –
Это не работает, я только что проверил с Gradle 2.3 и Intellij IDEA 14.1.2 в аналогичной настройке, как OP –