Предоставленные зависимости с использованием 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
}

Обратите внимание на дополнительный набор скобок во втором примере кода