35

我有一个小型 Java/Gradle 项目。我正在使用应用程序插件来创建一个 zip 分发(使用 distZip 任务)。使用标准配置,我的 zip 文件中包含以下目录:

/bin - 启动应用程序的脚本放在此处
/lib - 在 JAR 文件和所有依赖项 JAR 文件中包含我的项目代码。

问题是我想要第三个目录:/conf我可以在其中放置我的配置文件(而不是将它们打包在我的应用程序 JAR 文件中。

我想这是一个非常普遍的要求,因为像 log4j.xml 和 hibernate.properties 这样的东西最好放在 JAR 文件之外。我只是不知道如何自定义应用程序插件的行为来做到这一点。

4

5 回答 5

38

几个月后我重新审视了这个问题,我终于有了一个优雅的解决方案。应将以下代码添加到 gradle 文件中:

distZip {
    into(project.name) {
        from '.'
        include 'conf/*'
    }
}

这为 distZip 任务添加了一个额外的包含。这会将“conf”目录(包括内容)复制到 Zip 发行版中。

生成的 zip 文件包含一个与项目名称相同的目录。这就是为什么需要“进入”部分的原因。

于 2011-06-14T12:58:18.580 回答
29

dist实际上,在项目的目录下创建一个目录srcapplicationDistribution运行 installApp 或 distZip 时,此目录中的任何内容都由应用程序插件(在 下)复制。

或者编辑applicationDistribution做其他事情,如果一个简单的副本是不够的。

于 2012-02-24T18:46:05.990 回答
16

对我来说,一个简单的

applicationDistribution.from("src/main/config/") {
    into "config"
}

做了这项工作。当然,您需要从代码中正确加载您的属性。特别是如果您将它们从可以通过类路径使用的 src/main/resources 移动到新位置。我通过添加指向配置文件的命令行参数来规避这个问题。

于 2014-03-31T11:19:48.297 回答
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

最后,如果您不希望在最终 zip 中使用您的配置,您可以这样做:

distZip {
   exclude('**/*.properties') // your configuration files
}

同样,可能有更好的方法。这是一种方式。

于 2011-04-22T00:35:50.767 回答
2

OP 的自我回答可能对他的用例有好处,但我想改进以下几点:

  1. 他的回答表明他有一个confbuild.gradle. Maven标准目录布局中没有这样的东西。普遍的共识是有一个src/main/conf文档中暗示的那样:

如果工件构建中有其他贡献源,它们将位于其他子目录下:例如 src/main/antlr 将包含 Antlr 语法定义文件。

  1. 目标目录名称project.name与评论中指出的不同。

  2. 如果需要资源过滤(通常是这样),那么需要有一个单独的任务。在本地开发过程中,可以运行此任务来生成过滤后的文件。分发将仅使用此任务的输出(与 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")
                }
            }
        }
    }
    
于 2017-12-18T03:33:40.500 回答