Scala 使用Maven覆盖application.conf并生成jar文件
我有一个使用Maven v3创建的Scala应用程序(v2.13)。我的资源路径是:Scala 使用Maven覆盖application.conf并生成jar文件,scala,maven,jar,config,Scala,Maven,Jar,Config,我有一个使用Maven v3创建的Scala应用程序(v2.13)。我的资源路径是: src->main->resources->application.conf和application.prod.conf 当我生成用于生产的JAR文件时,我想从application.conf获取配置资源,但被application.prod.conf覆盖 我找不到解决方案,所有创建的示例都是针对Play framework或以前的maven版本的 JAR文件是使用maven-packagecmd生成的 app
src->main->resources->application.conf和application.prod.conf
当我生成用于生产的JAR文件时,我想从application.conf
获取配置资源,但被application.prod.conf
覆盖
我找不到解决方案,所有创建的示例都是针对Play framework或以前的maven版本的
JAR文件是使用maven-package
cmd生成的
application.prod.conf文件
include "application.conf"
# override default (DEV) settings
http {
host = "99.999.999.9"
port = 1111
}
以下示例不适用于我,因为从target
path中,我只获得了在生产中移动它的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>
maven antrun插件
3.0.0
包裹
跑
这里有几个选项:
application.prod.cont
是静态的,并且随jar
一起提供,为什么您的代码中不能有一个逻辑,根据应用程序正在执行的环境加载相应的应用程序配置
-Dconfig.resource=/application.prod.conf
java命令行参数
application.prod.conf
,那么您可以将-Dconfig.file=/path/to/application.prod.conf
application.prod.cont
是静态的,并且随jar
一起提供,为什么您的代码中不能有一个逻辑,根据应用程序正在执行的环境加载相应的应用程序配置
-Dconfig.resource=/application.prod.conf
java命令行参数
application.prod.conf
,那么您可以将-Dconfig.file=/path/to/application.prod.conf
Maven有一个阶段的概念(确切地说,我们这里讨论的是阶段
包),它是生命周期中可以调用插件的逻辑位置。例如,一些插件,如创建jar的插件,自动关联到阶段(开箱即用),其他插件则显式定义并与阶段关联(如maven-antrun-plugin
,它在阶段包
期间执行,如您在代码段中所示)
考虑到这一点,是否有可能在打包jar之后尝试复制文件,以便在工件打包到jar之后调用antrun
插件
如果是这样,最简单的解决方案是将其移动到之前的一个阶段,例如准备软件包
:
<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有一个阶段的概念(确切地说,我们这里讨论的是阶段包
),它是生命周期中可以调用插件的逻辑位置。例如,一些插件,如创建jar的插件,自动关联到阶段(开箱即用),其他插件则显式定义并与阶段关联(如maven-antrun-plugin
,它在阶段包
期间执行,如您在代码段中所示)
考虑到这一点,是否有可能在打包jar之后尝试复制文件,以便在工件打包到jar之后调用antrun
插件
如果是这样,最简单的解决方案是将其移动到之前的一个阶段,例如准备软件包
:
<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>
话虽如此,将产品的配置文件“烘焙”到工件中可能不是一个好主意,这里有两个问题:
您的源代码包含有关生产的信息—主机、端口,甚至可能是密码或密钥之类的敏感信息—这不应该发生
从构建的角度来看,您的工件与具体环境是耦合的,这基本上也是一种不好的实践
解决这个问题的技巧超出了问题的范围,但至少您已经得到警告:)谢谢您的详细回答。如果我理解,您告诉我不要在应用程序配置文件中存储主机、端口、dbUser和pw。这是使用简单的命令行在生产环境中运行应用程序最简单的方法,因为我们还没有实现ci/cd。然后,我想我可以在jenkins脚本文件中移动所有这些数据(或者这将与应用程序配置文件相同?)。无论如何,我们使用vpn连接到我们的应用程序,所以我认为(我希望)即使配置文件中有敏感数据也是安全的。谢谢你的详细回答。如果我理解,您告诉我不要在应用程序配置文件中存储主机、端口、dbUser和pw。这是使用简单的命令行在生产环境中运行应用程序最简单的方法,因为我们还没有实现ci/cd。然后,我想我可以在jenkins脚本文件中移动所有这些数据(或者这将与应用程序配置文件相同?)。无论如何,我们使用vpn连接到我们的应用程序,所以我认为(我希望)即使配置文件中有敏感数据也是安全的