Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用Maven覆盖application.conf并生成jar文件_Scala_Maven_Jar_Config - Fatal编程技术网

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

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

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

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
    一起提供,为什么您的代码中不能有一个逻辑,根据应用程序正在执行的环境加载相应的应用程序配置

  • 它是类型安全配置吗?如果是,在prod中运行时,您可以传递
    -Dconfig.resource=/application.prod.conf
    java命令行参数

  • 或者jar没有附带
    application.prod.conf
    ,那么您可以将
    -Dconfig.file=/path/to/application.prod.conf

  • 这里有几个选项:

  • 如果您的
    application.prod.cont
    是静态的,并且随
    jar
    一起提供,为什么您的代码中不能有一个逻辑,根据应用程序正在执行的环境加载相应的应用程序配置

  • 它是类型安全配置吗?如果是,在prod中运行时,您可以传递
    -Dconfig.resource=/application.prod.conf
    java命令行参数

  • 或者jar没有附带
    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连接到我们的应用程序,所以我认为(我希望)即使配置文件中有敏感数据也是安全的