我有一个小的Java/Gradle项目。我正在使用Application插件创建一个zip发行版(使用distZip任务)。使用标准配置,我在zip文件中得到以下目录:
/bin -启动应用程序的脚本在这里
/lib -包含我的项目代码在一个JAR文件和所有依赖JAR文件。问题是我想要第三个目录:/conf,我可以把我的配置文件(而不是把它们打包在我的应用程序JAR文件)。
我想这是一个非常常见的需求,因为像log4j.xml和hibernate这样的东西。属性最好放在JAR文件之外。我只是不知道如何定制应用程序插件的行为来做到这一点。
几个月后我重新审视了这个问题,我终于有了一个优雅的解决方案。下面的代码应该添加到gradle文件中:
distZip {
into(project.name) {
from '.'
include 'conf/*'
}
}
这将向distZip任务添加一个额外的包含。这将"conf"目录(包括内容)复制到Zip发行版中。
生成的zip文件包含一个与项目名称相同的目录。
实际上,在项目的src
目录下创建一个dist
目录。当installApp或distZip运行时,此目录中的任何内容都由应用程序插件(在applicationDistribution
下)复制。
或编辑applicationDistribution
做其他事情,如果一个简单的复制是不够的。
对我来说,一个简单的
applicationDistribution.from("src/main/config/") {
into "config"
}
完成了任务。当然,您需要从代码中正确加载属性。特别是如果你把它们从src/main/resources中通过类路径移动到新的位置。我通过添加一个指向配置文件的命令行参数来规避这个问题。
我不确定您是否可以自定义应用程序插件,我从未使用过它。然而,还有其他方法可以实现你想要实现的目标。
你可以像这样创建一个/conf
目录:
confDir = new File("$buildDir/conf")
你可以复制你需要的文件到这个目录,像这样:
task copyConfFiles(type: Copy) {
from _wherever your files reside_
into confDir
include('**/*.properties') // your configuration files
}
你可以像这样把这个复制任务挂接到进程中:
distZip.dependsOn copyConfFiles
最后,如果你不希望你的配置在最后的zip文件中,你可以这样做:
distZip {
exclude('**/*.properties') // your configuration files
}
也许还有更好的方法。这是一种方式。
OP的自我回答可能对他的用例很好,但有一些事情我想改进:
- 他的回答表明他有一个与
build.gradle
平行的目录conf
。在Maven标准目录布局中没有这样的东西。一般的共识是有一个src/main/conf
,正如在文档中暗示的那样:
如果有其他对工件构建有贡献的源,他们会在其他子目录下:例如src/main/antlr会包含Antlr语法定义文件
-
目标目录名不是
project.name
,正如在注释中指出的那样。 -
如果需要资源过滤(通常是这样),那么需要有一个单独的任务。在本地开发期间,可以运行此任务来生成过滤后的文件。发行版将只使用该任务的输出(与OP的答案不同,这也使
conf
对tar发行版可用)。def props = new Properties() file("src/main/filters/application.properties") .withInputStream { props.load(it) } import org.apache.tools.ant.filters.ReplaceTokens task copyConf(type: Copy) { from("src/main/conf/") into("$buildDir/conf") filesMatching("**/*.y*ml") { filter(tokens: props, ReplaceTokens) } } distributions { main { contents { from(copyConf) { into("conf") } } } }