首页 文章

在Gradle Application Plugin中部署其他文件

提问于
浏览
28

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

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

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

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

5 回答

  • 25

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

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

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

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

  • 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
    }
    

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

  • 13

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

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

  • 30

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

    • 他的回答表明他有一个与 build.gradle 平行的目录 conf . 在Maven Standard Directory Layout中没有这样的东西 . 普遍的共识是,如文件中暗示的那样: 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")
                }
            }
        }
    }
    
  • 0

    对我来说,简单

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

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

相关问题