在Gradle Application Plugin中部署其他文件

时间:2011-04-21 10:47:14

标签: java gradle

我有一个小型的Java / Gradle项目。我正在使用Application plugin创建一个zip分发(使用distZip任务)。使用标准配置,我在我的zip文件中获得以下目录:

/ bin - 启动应用程序的脚本在这里进入 / lib - 包含JAR文件中的项目代码和所有依赖项JAR文件。

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

我认为这是一个非常常见的要求,因为像log4j.xml和hibernate.properties这样的东西会更好地放在JAR文件之外。我无法弄清楚如何自定义Application插件的行为来执行此操作。

5 个答案:

答案 0 :(得分:31)

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

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)

OP的自我回答可能对他的用例有好处,但有一些我想改进的事情:

  1. 他的回答表明他有一个与conf平行的目录build.gradle。 Maven convention for modules to be lower case中没有这样的东西。普遍的共识是在文档中暗示src/main/conf
  2.   

    如果有工件构建的其他贡献源,他们   将在其他子目录下:例如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")
                  }
              }
          }
      }