构建一个 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
war1
和 war2
都依赖于 jar1
和 jar2
。
jar1
和 jar2
模块依赖于第三方库(由 mavenCentral 托管),我们称之为 third-party1.jar
和 third-party2.jar
。
war1
和 war2
也依赖于 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
存档的根目录中获得 war
s,earshared
依赖项放在 /lib
目录下。
jar1
和 jar2
工件及其依赖项也放在 /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'
}
我有一个这样的 java-ee 项目
/project/war1/build.gradle
/project/war2/build.gradle
/project/jar1/build.gradle
/project/jar2/build.gradle
/project/ear/build.gradle
war1
和 war2
都依赖于 jar1
和 jar2
。
jar1
和 jar2
模块依赖于第三方库(由 mavenCentral 托管),我们称之为 third-party1.jar
和 third-party2.jar
。
war1
和 war2
也依赖于 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
存档的根目录中获得 war
s,earshared
依赖项放在 /lib
目录下。
jar1
和 jar2
工件及其依赖项也放在 /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'
}