带有环境变量文件的 Maven 安装命令

Maven install command with environment variables file

有什么方法可以执行环境变量文件 .env 以及 mvn clean installmvn clean deploy 等 Maven 命令。我正在寻找类似解决方案的概念背后的主要思想:

mvn clean install -DenvFile=/path/<filename>.env

mvn clean deploy -DenvFile=/path/<filename>.env

mvn clean package -DenvFile=/path/<filename>.env

Note: Not trying to produce the environment specific builds. In dev environment, my intention to run the junit tests with all the environment variables configured from <filename>.env.

其中,上述 maven 命令应设置 <filename>.env 中的所有环境变量,然后执行 maven 插件。在 IntelliJ 中,有一个 envFile 插件完全相同。

不想在我的项目中使用特定于环境的属性 dev|staging|prod.properties,因为它杂乱无章且难以管理。我宁愿有一个包含所有 dynamic/changeable 属性的单一环境特定文件 filename.env

application.properties

spring:
  cloud:
    config:
      uri: http://config-service:${CONFIG_SERVICE_PORT}
      fail-fast: true
      password: ${CONFIG_SERVICE_PASSWORD}
      username: user

环境文件: .env

CONFIG_SERVICE_PORT=8080
CONFIG_SERVICE_PASSWORD=123

现在,当我在 AWS、GCP 和 Azure 等不同环境中部署应用程序时。我只需要更改 .env 文件和 运行 应用程序 java -DenvFile=/path/<fileName>.env -jar application.jar 中的环境变量,它就会发挥作用。

我的问题与 dev-mode 中用于测试的 maven-sure-fire 插件有关,它需要 spring context 的这些环境变量。

如有任何帮助,我们将不胜感激。

好的,从您的评论来看,您似乎正在寻找两种不同的解决方案:

  1. 运行不同环境下的应用java -DenvFile=/path/<fileName>.env -jar application.jar
  2. 运行宁测试的解决方案。

这些是不同的问题,我会尝试同时解决这两个问题

第 1 期

当你 运行 java -jar 这意味着工件已经组装好了(据我所知,在 spring boot maven 插件的帮助下)。 这个 jar 是一个准备就绪的 spring 启动应用程序,maven 在这里基本上是无关紧要的 - maven 是一个构建系统,spring 是一个 运行time 框架,我们正在谈论 运行时间。

Spring boot有很多方法可以实现你想要的。 "Native" spring 接近您情况的启动方式是 运行 使用“--spring.config.location=file:// 和所有必需的配置 [=28] 连接应用程序=]

看起来像这样(完整文档请参阅 here):

java -jar application.jar --spring.config.location=myprops.properties

即使您在 src/main/resources/application.properties 中定义了某些属性,此方法也允许有效地覆盖它们,从而提供了一种在不同环境中 运行 不同配置的方法。

这比 .env 文件有优势,因为它可以在所有 OS-es 中以相同的方式 运行,甚至 Windows ;) 因为 Java 是 OS 独立的 - 我相信这是你能做到的最好的。

当然你可以将java -jar行包裹在某种bash脚本中并在运行启用jvm之前加载/执行一系列export命令,但同样,它的方式较少 "spring-y"。

第 2 期

Maven 运行s 测试 (unit/integration) 以 spring 启动 maven 插件无关的方式。这都是关于 surefire/failsafe 和 spring 启动测试框架。

我假设你问的是集成测试,因为我相信这与单元测试无关,因为那些根本不需要任何环境变量,应该是 运行 而没有 spring 完全(junit/mockito 应该做的工作)

我也会允许自己保持这样的假设,即 overriding/configuring spring 通过 yaml 或属性文件启动应用程序的方式比 .env 更好,并且会提供 spring在此处测试配置解决方案:

根据这些假设,您可以在以下路径中创建一个 yaml 文件:src/test/resources/application-test.yml

此文件可以包含与测试相关的配置,并将覆盖 src/main/resources/application.yml 中编写的任何内容。注意,由于 application-test.yml 驻留在测试源中,spring boot maven 插件不会将其打包到应用程序中。

根据进行集成测试的确切方式,您可能还会考虑使用 @TestPropertySource 注释来提供不遵循 spring 引导默认约定的自定义 properties/yaml 文件。它对于 spring 驱动的测试特别有用,这些测试没有 bootstrap spring 引导完全成熟的支持(阅读使用 junit 的 spring 运行ner 的测试但是不要'有注释 @SpringBootTest)

另一个可能有用的注释是 @ActiveProfile("myprofile")。这将导致 spring 引导测试自动加载文件 src/test/resources/application-myprofile.yml(或 application-myprofile.properties

最后但并非最不重要的一点是,我将引用源代码中带有 "dev/prod/staging/properties" 的第二条评论。 说到测试——应该只有一个文件 application-test.yml。但是请注意,当您使用 yaml 时,可以在同一文件中为许多 spring 引导配置文件定义配置:

# default value
foo:
 bar: 1

---
spring:
  profiles: staging
foo:
  bar: 2

--- 
spring:
  profiles: prod
foo:
  bar: 3

一些相关的