我正在尝试组装 耳朵 使用 Gradle,其中 application.xml
包含一些非 ejb 模块。相关项目文件是使用 {basename}-{version}.{extension}
生成的。标准,因此看起来像,例如subproject-0.2.6.rar
.但是,由于其中一些项目需要标记为 java 或连接器模块,因此我在解决正确文件时遇到了问题。
这是构建脚本的样子:
apply plugin: 'ear'
dependencies {
deploy project(':EJB-Project')
deploy project(':Commons')
deploy project(':UpdateManager')
earlib 'net.sf:jasperreports:unknown'
earlib 'org.apache.axis:axis:1.4'
}
ear {
deploymentDescriptor {
applicationName = 'EnterpriseProject'
module('Commons.jar', 'java')
module('UpdateManager.rar', 'connector')
}
// Remove the version postfix from archived files
rename(/(.*)-${version}(.)/, /$1$2/)
}
jboss-deployment-structure.xml
在没有版本说明符的情况下声明了子部署节点中的文件。<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
...
<sub-deployment name="EJB-Project.jar">
<dependencies />
<exclusions />
</sub-deployment>
<sub-deployment name="Commons.jar">
<dependencies />
<exclusions />
</sub-deployment>
...
ear 任务中的 rename 方法成功地重命名了
deploy
中的库。配置,但 Gradle 添加了依赖项,这些依赖项未通过 module(String path, String identifier)
显式添加自动使用其原始名称作为 ejb 模块:<module>
<ejb>EJB-Project-4.5.2.jar</ejb>
</module>
我很想以一种干净的方式解决这个问题 - 例如,在模块部分引用项目本身,而不是指定文件名(及其扩展名)并为 JBoss 生成部署 xml,但我不知何故被卡住了。我希望删除所有版本字符串,或保留所有版本字符串。
最佳答案
我在 gradle 6.8 中解决了类似的问题:
我从这里开始:
plugins {
id 'ear'
}
dependencies {
deploy 'org.cpp.pp:dmReports:5.04.01-2'
deploy project(':reporting-transpoLib')
}
ear {
deploymentDescriptor {
module('dmReports-5.04.01-2.jar', 'java')
module("reporting-transpoLib-${project.version}.jar", 'java')
}
}
它产生了一个包含带有版本的 jar 和带有版本的部署描述符的耳朵。但是我还有第二次 war ,在它的部署描述符中指定了对 dmReports 的依赖。
对于通过这个耳朵部署的每个新版本的 dmReports,我还必须更新 war 部署描述符(依赖部分)——这不好。
我需要从耳朵和 war 部署描述符中删除 dmReports 版本。
于是我改成了这个耳朵:
plugins {
id 'ear'
}
configurations {
dmReports
reportingTranspoLib
}
dependencies {
dmReports 'org.cpp.pp:dmReports:5.04.01-2'
reportingTranspoLib project(':reporting-transpoLib')
}
// copyToLib task copies the dependencies and rename them (remove version) in a separate
// folder: ${buildDir}/lib. This folder will be used as input for deploy configuration
task copyToLib {
dependsOn(':reporting-transpoLib:build')
doFirst {
def configNames = [ 'dmReports', 'reportingTranspoLib']
configNames.each { configName ->
configurations.getByName(configName).resolvedConfiguration.resolvedArtifacts.each { artifact ->
project.copy {
from artifact.file
into "${buildDir}/lib"
rename { "${artifact.name}.${artifact.extension}" }
}
}
}
}
}
// the output of copyToLib task (folder ${buildDir/lib}) is taken and used by configuration deploy
dependencies {
deploy files("${buildDir}/lib")
}
ear {
dependsOn(copyToLib)
// from(copyToLib)
deploymentDescriptor {
module('dmReports.jar', 'java')
module("reporting-transpoLib.jar", 'java')
}
}
所以我得到了一个包含没有版本的 jar 和没有版本的部署描述符的耳朵。非常有用。
关于Gradle Ear 插件 : Adding modules without version specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301666/