构建一个 EAR Gradle 在 WAR 之间共享依赖关系

Build an EAR with Gradle sharing dependencies between WARs

我有一个这样的 java-ee 项目

/project/war1/build.gradle
/project/war2/build.gradle
/project/jar1/build.gradle
/project/jar2/build.gradle
/project/ear/build.gradle

war1war2 都依赖于 jar1jar2jar1jar2 模块依赖于第三方库(由 mavenCentral 托管),我们称之为 third-party1.jarthird-party2.jarwar1war2 也依赖于 third-party3.jar 我想在它们之间共享的库。

我期望的是 ear 这样的:

META-INF/MANIFEST.MF
META-INF/application.xml
war1.war
war2.war
lib/jar1.jar
lib/jar2.jar
lib/third-party1.jar
lib/third-party2.jar
lib/third-party3.jar

这是正确的吗?如何使用 gradle 实现此目的? gradle ear 插件文档对此根本没有解释,这在我看来是最常见的模式。

所以我想我终于明白了:

ear/build.gradle应该是这样的:

plugins {
    id 'java'
    id 'ear'
}

dependencies {
    /* jars */
    earlib project(path: ':jar1')
    earlib project(path: ':jar1', configuration: 'compile')

    earlib project(path: ':jar2')
    earlib project(path: ':jar2', configuration: 'compile')

    /* wars */
    deploy project(path: ':war1', configuration: 'archives')
    earlib project(path: ':war1', configuration: 'earshared')

    deploy project(path: ':war2', configuration: 'archives')
    earlib project(path: ':war2', configuration: 'earshared')
}

这样我们在 .ear 存档的根目录中获得 wars,earshared 依赖项放在 /lib 目录下。

jar1jar2 工件及其依赖项也放在 /lib

earshared 是自定义配置 wars' build.gradle 看起来像这样:

configurations {
    earshared
}

apply plugin: 'war'

jar.enabled = true

description = 'war1'
dependencies {
    providedCompile project(':jar1')
    providedCompile project(':jar2')
    earshared group: 'org.example', name: 'third-party3', version:'1.0.0'
}

sourceSets { 
    main {  compileClasspath += configurations.earshared }
}

而罐子的 build.gradle 看起来像这样:

description = 'jar1'

dependencies {
    compile group: 'org.example', name: 'third-party1', version:'2.6.0'
    compile group: 'org.example', name: 'third-party2', version:'2.6.0'
}