我是新手,所以这可能是一个典型的新蜜蜂问题。
在gradle构建中,我们有一组war文件(依赖项),所有这些文件都包含在构建我们的ear文件之前需要从这些war文件中删除的文件。
我如何实现以下目标:
- for all war files in a folder,
- extract war content to a location (using a Copy task & zipTree)
- re-pack to a new war applying a filter (using War & excludes)
我假设我将创建一个新任务并添加一些“dependsOn”声明。
task excludeUnwantedFiles(){
file(directoryWithOriginalWars).eachFile { file ->
???? unpack war, filter, assemble new war file ????
}
}
ear.dependsOn(excludeUnwantedFiles)
excludeUnwantedFiles.dependsOn(downloadAllOriginalWarsIntoDirectory)
如何创建针对每个war文件执行的任务?做这个的最好方式是什么?
我有办法在一项任务中做到这一点吗?例如。复制任务并使用zipTree(fooBarWithFile.war)作为'from'和'war(fooBarWithoutFile.war)'并在两者之间应用过滤器?
还是只是循环而已? Delete/Remove file from war with Gradle
任何帮助深表感谢!
干杯,
d。
--------- UPDATE -------------------
感谢您的Java解决方案。
正如我在评论中提到的那样,我遇到了一个问题,即war文件是在执行期间下载/提取的,因此无法在配置时定义新任务。
我的解决方法是使用tarTree(带有过滤器)来访问尚未提取的 war 文件列表。请参阅下面的代码示例:
def warFileSourceTarGz = '...tar.gz'
def nfsLibDir="$buildDir/dependencies/"
def nfsLibDownloadDir="$buildDir/downloadedDependencies/"
// task that downloads & extracts the tar.gz
task fetchNfsDependencies(type: Copy) {
from tarTree(warFileSourceTarGz)
into nfsLibDownloadDir
}
// loop through all war files inside the tar.gz and
// create a task to remove unwanted libraries for each war
task excludeUnwantedJarsFromWars(dependsOn: fetchNfsDependencies){
// access the "remote" tar.gz file to get the list of war-files to loop over
def warFileSource = tarTree(warFileSourceTarGz).matching{
include '*.war'
}
// for every war-file, create an exclude-path
warFileSource.visit { nextWarFile ->
if(nextWarFile.name.endsWith('.war')) {
String taskName = "excludeUnwantedJarsFrom_${nextWarFile.name.replace('.war', '')}"
String nextWarFilePath = nfsLibDownloadDir+"/"+nextWarFile.name
Zip tweakWarTask = tasks.create(name: taskName, type: Zip, dependsOn: fetchNfsDependencies) {
from zipTree(nextWarFilePath)
destinationDir = file(nfsLibDir)
archiveName = nextWarFile.name
// exclude these jars, as they cause classloading problems in our ear deployment.
exclude 'WEB-INF/lib/jcan-optrace*'
}
// hook into build-process
ear.dependsOn(tweakWarTask)
}
}
}
ear.dependsOn(excludeUnwantedJarsFromWars)
最佳答案
我将为每个war文件创建一个Zip
任务,并通过让assemble
依赖所有任务将所有任务连接到DAG中
FileTree warFiles = fileTree(dir: 'path/to/wars', includes: ['**/*.war'])
warFiles.files.each { File warFile ->
String taskName = "tweakWar${warFile.name.replace('.war', '')}"
Zip tweakWarTask = tasks.create(name: taskName, type: Zip) {
from zipTree(warFile) {
exclude 'path/to/some/file.xml'
}
destinationDir = "$buildDir/tweakedWars"
archiveName = warFile.name
}
// wire the task into the dag
assemble.dependsOn tweakWarTask
}