在Gradle Application Plugin中部署其他文件



我有一个小的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的自我回答可能对他的用例很好,但有一些事情我想改进:

  1. 他的回答表明他有一个与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")
                }
            }
        }
    }
    
  • 最新更新