我对gradle比较陌生,所以这可能是一个典型的新问题。
在我们的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)
我假设我将创建一个新任务并添加一些“依赖”声明。
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)”并在两者之间应用筛选器?
感谢Lance 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
}
我正在使用gradle构建一个Spring Boot应用程序,我希望从war中删除文件,因为该文件将从外部加载(它运行在tomcat容器中,而不是嵌入式的)。 我查看了StackOverflow和Gradle文档,试图找出该做什么,但我不知道该绑定到哪个阶段,以及在创建war之前还是之后排除该文件。处理文件似乎也有多种方法。 我相信Maven使用作为等价物。
我有两个war文件要部署在tomcat中的一个linux服务器中。考虑到只有一台linux服务器,我有两种方法来部署它们。 > 在一个tomcat中部署两个war文件。内存分配将在两个war文件实例之间共享 B.部署任何一个war文件都意味着这两个文件都要停机 在两个不同的Tomcat实例中部署两个war文件。必须分别为每个Tomcat分配内存。这意味着,如果第一个war文件在某些时间占用更多内存
我正在尝试替换用Gradle生成的WAR文件中的一个文件。
那么如何防止插件jar进入war文件呢?多谢了。
使用Ant创建WAR文件非常简单,与创建JAR文件任务非常相似。 毕竟,WAR文件,就像JAR文件只是另一个ZIP文件。 WAR任务是JAR任务的扩展,但它有一些很好的补充,可以操作进入WEB-INF/classes文件夹的内容,并生成web.xml文件。 WAR任务对于指定WAR文件的特定布局很有用。 由于WAR任务是JAR任务的扩展,因此JAR任务的所有属性都适用于WAR任务。 Sr.No.
我正在改变我们的项目,以使用gradle作为构建工具,但正在与2个问题斗争;