gradle build<ConfigurationName>: ear 和 war 的不同包装 (gradle v2.3)
gradle build<ConfigurationName>: different packaging for ear and war (gradle v2.3)
我想使用 gradle v2.3 配置以两种方式打包我的应用程序:
- ear 所有库都在 ear 的 lib 目录 和 multipe wars inside ear (deps declared with 提供编译和earlib)
- 多个 war 文件,每个 war 在 WEB-INF/lib 中包含库(deps用 compile)
声明
如果每次我想要不同的包装时修改 build.gradle 文件,我就可以执行这两项任务中的每一项。
我想使用 configurations 来选择 jars 是否包含在 war 文件中或不是通过使用 gradle build<ConfigurationName>
.
根据帮助和 Whosebug post How to use uploadConfigurationName and buildConfigurationName 我编写了以下文件(这是 war 之一):
apply plugin: 'war'
configurations {
packEar
packWar
}
dependencies {
configurations.packEar {
providedCompile project(':Common') // jars will be included using earlib
}
configurations.packWar {
compile project(':Common') // jars included in war
}
}
artifacts {
packWar war
packEar war
}
问题是命令gradle buildpackWar
和gradle buildpackEar
产生相等wars 不包括来自 Common
项目的 jars。
如果我将 packEar 的配置从 providedCompile
更改为 compile
,两者都会生成 war,其中包含 jars。
附加信息: 我尝试使用 extendFrom compile / providedCompile
但似乎没有任何影响。我包括了 buildpackWar
和 buildpackEar
方法,但它也不起作用(可能是我以错误的方式使用了它们)。
感谢您的回答!
此致,
齐加
compile
和 providedCompile
是它们自己的配置,因此您要将 Common 项目添加到它们,而不是 packWar
和 packEar
配置。像这样的东西应该可以工作:
项目mywar
apply plugin: 'war'
apply plugin: 'java'
repositories {
jcenter()
}
configurations {
shareable
}
dependencies {
shareable project(':common')
}
task standaloneWar(type: War, dependsOn: war) {
baseName = war.baseName + '-standalone'
classpath = war.classpath + configurations.shareable
}
artifacts {
archives standaloneWar
}
项目myear
apply plugin: 'ear'
apply plugin: 'java'
evaluationDependsOn ':mywar'
repositories {
jcenter()
}
dependencies {
deploy project(':mywar')
earlib project(path: ':mywar', configuration: 'shareable')
}
它将产生三个主要工件:
mywar.war
,不包含 shareable
中的任何依赖项(如 common
)
mywar-standalone.war
,其中包含 shareable
中的依赖项
myear.ear
,其中包含根目录中的 mywar.war
(技术上 mywar.jar
)和 mywar
项目中 shareable
的依赖项 /lib
(如common
)
使用 Ben Navetta 提供的信息,我设法生成了一个可用的配置,它只需要进行一些小的调整。这是文件
ACL war
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
configurations {
shareable
publishedWar // need this so war gets placed in ear instead of jar,
// using archives puts both wars in ear
}
dependencies {
providedCompile project(':Common');
shareable project(':Common');
}
war {
baseName = war.baseName + '-thin'
classpath = war.classpath
}
task standaloneWar(type: War, dependsOn: war) {
baseName = project.name // sharable war's name without modifications
classpath = war.classpath + configurations.shareable
}
artifacts {
archives standaloneWar
publishedWar war // to be included in ear
}
注:
- 如果省略
providedCompile project(':Common');
,则不会
编译
- 我添加了 war {...} 这样我就可以重命名 war 而不是
包含任何依赖项并具有 war 的名称
包含名称未修改的依赖项
EAR
apply plugin: 'ear'
evaluationDependsOn ':ACL' // probably not needed
dependencies {
deploy project(path: ':ACL', configuration: 'publishedWar')
earlib project(path: ':ACL', configuration: 'shareable')
}
ear {
deploymentDescriptor {
webModule ('ACL-thin.war', "${project.name}/ACL") // set context root
}
}
注:
- if publishedWar 配置没有应用 jar 放在 ear
- 如果使用 archives both wars 在 ear 中获得位置
- 如果您使用 eclipse 插件,请考虑将
earlib project(path: ':ACL', configuration: 'shareable')
更改为 earlib project(':Common')
否则您将不得不修改 eclipse 中的部署程序集(war 将包含在 ear 的 lib 文件夹中 eclipse
我想使用 gradle v2.3 配置以两种方式打包我的应用程序:
- ear 所有库都在 ear 的 lib 目录 和 multipe wars inside ear (deps declared with 提供编译和earlib)
- 多个 war 文件,每个 war 在 WEB-INF/lib 中包含库(deps用 compile) 声明
如果每次我想要不同的包装时修改 build.gradle 文件,我就可以执行这两项任务中的每一项。
我想使用 configurations 来选择 jars 是否包含在 war 文件中或不是通过使用 gradle build<ConfigurationName>
.
根据帮助和 Whosebug post How to use uploadConfigurationName and buildConfigurationName 我编写了以下文件(这是 war 之一):
apply plugin: 'war'
configurations {
packEar
packWar
}
dependencies {
configurations.packEar {
providedCompile project(':Common') // jars will be included using earlib
}
configurations.packWar {
compile project(':Common') // jars included in war
}
}
artifacts {
packWar war
packEar war
}
问题是命令gradle buildpackWar
和gradle buildpackEar
产生相等wars 不包括来自 Common
项目的 jars。
如果我将 packEar 的配置从 providedCompile
更改为 compile
,两者都会生成 war,其中包含 jars。
附加信息: 我尝试使用 extendFrom compile / providedCompile
但似乎没有任何影响。我包括了 buildpackWar
和 buildpackEar
方法,但它也不起作用(可能是我以错误的方式使用了它们)。
感谢您的回答!
此致, 齐加
compile
和 providedCompile
是它们自己的配置,因此您要将 Common 项目添加到它们,而不是 packWar
和 packEar
配置。像这样的东西应该可以工作:
项目mywar
apply plugin: 'war'
apply plugin: 'java'
repositories {
jcenter()
}
configurations {
shareable
}
dependencies {
shareable project(':common')
}
task standaloneWar(type: War, dependsOn: war) {
baseName = war.baseName + '-standalone'
classpath = war.classpath + configurations.shareable
}
artifacts {
archives standaloneWar
}
项目myear
apply plugin: 'ear'
apply plugin: 'java'
evaluationDependsOn ':mywar'
repositories {
jcenter()
}
dependencies {
deploy project(':mywar')
earlib project(path: ':mywar', configuration: 'shareable')
}
它将产生三个主要工件:
mywar.war
,不包含shareable
中的任何依赖项(如common
)mywar-standalone.war
,其中包含shareable
中的依赖项
myear.ear
,其中包含根目录中的mywar.war
(技术上mywar.jar
)和mywar
项目中shareable
的依赖项/lib
(如common
)
使用 Ben Navetta 提供的信息,我设法生成了一个可用的配置,它只需要进行一些小的调整。这是文件
ACL war
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
configurations {
shareable
publishedWar // need this so war gets placed in ear instead of jar,
// using archives puts both wars in ear
}
dependencies {
providedCompile project(':Common');
shareable project(':Common');
}
war {
baseName = war.baseName + '-thin'
classpath = war.classpath
}
task standaloneWar(type: War, dependsOn: war) {
baseName = project.name // sharable war's name without modifications
classpath = war.classpath + configurations.shareable
}
artifacts {
archives standaloneWar
publishedWar war // to be included in ear
}
注:
- 如果省略
providedCompile project(':Common');
,则不会 编译 - 我添加了 war {...} 这样我就可以重命名 war 而不是 包含任何依赖项并具有 war 的名称 包含名称未修改的依赖项
EAR
apply plugin: 'ear'
evaluationDependsOn ':ACL' // probably not needed
dependencies {
deploy project(path: ':ACL', configuration: 'publishedWar')
earlib project(path: ':ACL', configuration: 'shareable')
}
ear {
deploymentDescriptor {
webModule ('ACL-thin.war', "${project.name}/ACL") // set context root
}
}
注:
- if publishedWar 配置没有应用 jar 放在 ear
- 如果使用 archives both wars 在 ear 中获得位置
- 如果您使用 eclipse 插件,请考虑将
earlib project(path: ':ACL', configuration: 'shareable')
更改为earlib project(':Common')
否则您将不得不修改 eclipse 中的部署程序集(war 将包含在 ear 的 lib 文件夹中 eclipse