我有一个小型的Java / Gradle项目。我正在使用Application plugin创建一个zip分发(使用distZip任务)。使用标准配置,我在我的zip文件中获得以下目录:
/ bin - 启动应用程序的脚本在这里进入 / lib - 包含JAR文件中的项目代码和所有依赖项JAR文件。
问题是我想要第三个目录: / conf 我可以放置我的配置文件(而不是将它们打包到我的应用程序JAR文件中。
我认为这是一个非常常见的要求,因为像log4j.xml和hibernate.properties这样的东西会更好地放在JAR文件之外。我无法弄清楚如何自定义Application插件的行为来执行此操作。
答案 0 :(得分:31)
distZip {
into(project.name) {
from '.'
include 'conf/*'
}
}
这为distZip任务添加了一个额外的包含。这会将“conf”目录(包括内容)复制到Zip分发中。
生成的zip文件包含一个与项目名称相同的目录。这就是为什么需要“进入”部分。
答案 1 :(得分:27)
实际上,在项目的dist
目录下创建一个src
目录。当运行installApp或distZip时,此目录中的任何内容都会被应用程序插件(在applicationDistribution
下)复制。
如果简单副本不够,可以编辑applicationDistribution
来执行其他操作。
答案 2 :(得分:14)
对我来说,一个简单的
applicationDistribution.from("src/main/config/") {
into "config"
}
完成了这项工作。当然,您需要在代码中正确加载属性。特别是如果您将它们从可通过类路径使用的src / main / resources移动到新位置。我通过添加指向配置文件的命令行参数来规避这一点。
答案 3 :(得分:7)
我不确定您是否可以自定义应用程序插件,我从未使用过它。然而,还有其他方法可以实现您想要实现的目标。
您可以创建一个/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
如果你不想在最终的拉链中使用你的配置,那么你可以这样做:
distZip {
exclude('**/*.properties') // your configuration files
}
同样,可能有更好的方法。这是 a 方式。
答案 4 :(得分:0)
conf
平行的目录build.gradle
。 Maven convention for modules to be lower case中没有这样的东西。普遍的共识是在文档中暗示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")
}
}
}
}