【问题标题】:Delete/Remove file from war with Gradle使用 Gradle 从战争中删除/删除文件
【发布时间】:2015-10-29 16:34:35
【问题描述】:

我正在使用 gradle 构建 Spring Boot 应用程序,并且我希望将 application.properties 文件从战争中删除,因为它将在外部加载(这是在 tomcat 容器中运行,而不是嵌入)。

我查看了 StackOverflow 和 Gradle 文档,试图弄清楚该怎么做,但我不知道要绑定到哪个阶段,以及我是否在创建战争之前或之后排除了该文件。似乎还有多种处理文件的方法。

我相信 Maven 使用 packagingExcludes 来表示等效项。

【问题讨论】:

  • 为什么要删除application.properties?在任何情况下,您都可以通过在生产中运行时指定外部位置来覆盖它们。或者如果找不到属性,您是否希望它失败?因为即使您删除它们,我也很确定您的应用程序会启动并且只使用默认值。
  • 据我所知,仅在独立/嵌入式 Tomcat 中支持使用外部属性文件覆盖属性文件的功能,您只需将应用程序作为远 jar(或战争)运行.但是当在外部容器中运行时,该功能就会丢失。但是,如果您知道在 Tomcat 中执行此操作的方法,我很想听听如何做。谢谢。
  • 我无法确认/反驳外部配置在外部容器中不起作用。文档 (docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…) 中不起作用的是使用命令行或环境参数/参数。但我也看不出外部配置不起作用的原因。您是否尝试按照文档中的说明通过 JNDI java:comp/env 设置 spring.config.location

标签: gradle spring-boot


【解决方案1】:

虽然我无法阻止将文件添加到战争中,但我能够在战争创建后删除文件 - 部分归功于此问题的提示:Is there a quick way to delete a file from a Jar / war without having to extract the jar and recreate it?

在我的build.gradle 文件中,我在war 命令中附加了一个exec 命令,以便在创建war 文件后运行命令。该命令将从战争中删除application.properties 文件。这是任务扩展的样子:

war << {
    exec {
        workingDir 'build/libs'
        commandLine 'zip', '-d', "${appName}-${appVersion}.war", 'WEB-INF/classes/application.properties'
    }
}

简而言之,就是将工作目录更改为 gradle 放置 war 的位置,然后使用 zip 命令从 war 中删除一个文件。

【讨论】:

  • 这是在使用 Gradle 3.5 的旧项目中唯一有效的方法。其他答案谈到的“rootSpec.exclude”可能在较旧的 Gradle 版本中存在错误 - 甚至不会触及 WEB-INF 文件。
【解决方案2】:

如果您不关心将这些属性文件从 src/main/resources 复制到 build/resources/main 文件夹(不只是在将 build/resources/main 复制到战争),你可以使用:

在 build.gradle 文件中;

processResources {
    exclude('application.properties')
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2016-10-29
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多