使用Gradle(JetGradle)和Intellij Idea 13提供依赖关系

时间:2013-12-06 10:32:06

标签: intellij-idea gradle

我有一个多项目构建,其中包含多个依赖于一个jar模块的war模块。

war和jar模块都依赖于Spring,Hibernate等库,这些依赖项在war模块上定义为provideCompile,在jar上定义为编译。

问题是当JetGradle更新依赖关系时,所有工件都有错误,因为工件需要jar模块的依赖关系。

我想使用以下任何解决方案:

  1. 将库包含在服务器的lib文件夹中,让Intellij按照提供的方式处理它们。
  2. 以某种方式将库包含在项目范围的库中,因此即使在更新了gradle依赖项之后,intellij也会将它们放在所有工件上。
  3. 另一方面,我的方法从一开始就完全错了。

    war模块中的依赖关系定义为:

    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'
    ...
    

3 个答案:

答案 0 :(得分:22)

我找到的最佳解决方案是使用Gradle配置文件中的以下代码从jar模块设置传递“编译”依赖项:

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中的构思任务

我根据此网址上的信息运行此解决方案: https://github.com/Netflix/RxJava/pull/145 http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.idea.model.IdeaModule.html

我希望这有助于其他人

答案 1 :(得分:0)

我尝试了上述解决方案,但发现了一个问题。在我的场景中,我有一个具有上述配置的子项目。问题是子项目的传递依赖性没有在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 ]
}

答案 2 :(得分:0)

添加Adrijardi的答案, Gadle 2.0 + 不仅我必须改变

scopes.PROVIDED.plus += configurations.provided

scopes.PROVIDED.plus += [configurations.provided]

我也不得不改变

provided project(":module-name") {
    transitive = false
}

provided (project(":module-name")) {
    transitive = false
}

请注意第二个代码示例中的额外括号