Предоставленные зависимости с использованием Gradle (JetGradle) и Intellij Idea 13
У меня есть многопроектная сборка с несколькими военными модулями, которая зависит от одного модуля jar.
Оба модуля war and jar имеют зависимости от библиотек, таких как Spring, Hibernate и т.д., эти зависимости определяются как предоставленныеCompile на военных модулях и как компиляция на банке.
Проблема заключается в том, что когда JetGradle обновляет зависимости, все артефакты имеют ошибки, так как зависимости от модуля jar требуются для артефактов.
Я хотел бы использовать любое из этих решений:
- Включите библиотеки в папку lib на сервере и попросите Intellij обработать их как предоставленные.
- Включение библиотек в виде библиотек проекта так или иначе, поэтому intellij помещает их во все артефакты даже после обновления зависимостей gradle.
С другой стороны, мой подход может быть совершенно неправильным с самого начала.
Зависимости в военных модулях определяются как:
providedCompile 'org.slf4j:slf4j-log4j12:1.7.5'
providedCompile 'org.slf4j:jcl-over-slf4j:1.7.5'
...
compile(project(':jarModule')) {transitive = false}
...
Зависимости в модуле jar определяются как:
...
compile 'org.slf4j:slf4j-log4j12:1.7.5'
compile 'org.slf4j:jcl-over-slf4j:1.7.5'
...
Ответы
Ответ 1
Лучшее решение, которое я нашел, заключалось в том, чтобы установить переходные "компилируемые" зависимости из модуля jar, как предусмотрено с помощью следующего кода в файле конфигурации Gradle:
apply plugin: 'idea'
configurations {
provided
provided.extendsFrom(compile)
}
idea {
module {
scopes.PROVIDED.plus += configurations.provided
}
}
Для Gradle 2.0 + измените последний бит следующим образом:
idea {
module {
scopes.PROVIDED.plus += [configurations.provided]
}
}
Это решение работает с использованием плагина Intellij Gradle, а также задачи задачи в Gradle
Я получил это решение, основанное на информации об этих URL-адресах:
https://github.com/Netflix/RxJava/pull/145
http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.idea.model.IdeaModule.html
Я надеюсь, что это поможет кому-то еще
Ответ 2
Я попробовал вышеуказанное решение, но нашел проблему. В моем сценарии у меня был подпроект с указанной конфигурацией. Проблема заключалась в том, что переходные зависимости подпроекта не экспортировались в конфигурации IntelliJ, что заставило базовый проект прекратить компиляцию.
Я кое-что копал и наткнулся на этот маленький камень, который исправил проблему.
https://github.com/gradle/gradle/blob/ccddc438ce09293d84030ebe31668d739c8a228a/gradle/providedConfiguration.gradle
/**
* Adds a configuration named 'provided'. 'Provided' dependencies
* are incoming compile dependencies that aren't outgoing
* dependencies. In other words, they have no effect on transitive
* dependency management.
*/
configurations {
provided
providedPlusCompile.extendsFrom(compile, provided)
testCompile.extendsFrom(providedPlusCompile)
}
sourceSets.main {
compileClasspath = configurations.providedPlusCompile
}
plugins.withType(IdeaPlugin) {
idea.module.scopes.PROVIDED.plus = [ configurations.provided ]
}
Ответ 3
Добавляя к ответу от Adrijardi, для Gadle 2.0 + я не только изменил
scopes.PROVIDED.plus += configurations.provided
к
scopes.PROVIDED.plus += [configurations.provided]
Мне также пришлось изменить
provided project(":module-name") {
transitive = false
}
to
provided (project(":module-name")) {
transitive = false
}
Обратите внимание на дополнительный набор скобок во втором примере кода