使用 Maven 覆盖 application.conf 并生成 jar 文件

Overwriting application.conf using Maven and generating jar file

我有一个使用 Maven v3 创建的 Scala 应用程序 (v2.13)。我的资源路径是:

src -> main -> resources -> application.conf and aplication.prod.conf

当我生成用于生产的 JAR 文件时,我想从 application.conf 获取配置资源,但被 application.prod.conf.

覆盖

我找不到解决方案,所有建立的示例都是针对 Play 框架或以前的 maven 版本的。

JAR 文件是使用 maven package 命令生成的。

application.prod.conf 文件

include "application.conf"

# override default (DEV) settings

http {
  host = "99.999.999.9"
  port = 1111
}

以下示例对我不起作用,因为从 target 路径我只得到 JAR 文件以将其移动到生产环境中:

<plugin>
     <artifactId>maven-antrun-plugin</artifactId>
     <version>3.0.0</version>
     <executions>
         <execution>
             <phase>package</phase>
             <goals>
                 <goal>run</goal>
             </goals>
             <configuration>
                 <target>
                    <delete file="${project.build.outputDirectory}/application.conf"/>
                    <copy file="src/main/resources/application.prod.conf"
                          tofile="${project.build.outputDirectory}/application.conf"/>
                 </target>
             </configuration>
         </execution>
     </executions>
</plugin>

这里有几个选项:

  1. 如果你的 application.prod.cont 是静态的并且随 jar 一起提供,为什么你不能在代码中有一个逻辑来根据应用程序正在获取的环境加载适当的应用程序配置文件执行

  2. 它是类型安全的配置吗,如果是的话,而 运行 在产品中你可以传递 -Dconfig.resource=/application.prod.conf java 命令行参数

  3. 或者application.prod.conf没有自带jar那么可以通过-Dconfig.file=/path/to/application.prod.conf

Maven 有阶段的概念(准确地说,我们在这里谈论阶段 package),这是生命周期中可以调用插件的逻辑位置。一些插件,例如创建 jar 的插件,自动关联到阶段(out-of-the-box),其他您明确定义并与阶段关联的插件(如 maven-antrun-plugin 在阶段 package 正如您在代码片段中所展示的那样。

考虑到这一点,是否有可能在 jar 打包后 尝试复制文件,以便 antrun 插件在工件被打包进jar?

如果是这样,最简单的解决方案是将其移至之前的一个阶段,例如 prepare-package:

<plugin>
     <artifactId>maven-antrun-plugin</artifactId>
     <version>3.0.0</version>
     <executions>
         <execution>
             <phase>prepare-package</phase>  <!-- Note the change here -->
             <goals>
                 <goal>run</goal>
             </goals>
             <configuration>
                 <target>
                    <delete file="${project.build.outputDirectory}/application.conf"/>
                    <copy file="src/main/resources/application.prod.conf"
                          tofile="${project.build.outputDirectory}/application.conf"/>
                 </target>
             </configuration>
         </execution>
     </executions>
</plugin>

假设你有 maven 3(还没有 maven 版本 4,所以它可能是一个错字),关于 maven 中哪些阶段可用的信息 here

话虽如此,将生产配置文件“烘焙”到工件中可能不是一个好主意,这里有两个问题:

  1. 您的源代码包含有关生产的信息 - 主机、端口,甚至可能是密码或密钥等敏感信息 - 这不应该真的发生
  2. 从构建的角度来看,你的工件与具体环境耦合,这基本上也被认为是一种不好的做法。

解决这个问题的技术超出了问题的范围,但至少你已经被警告过:)