带有环境变量文件的 Maven 安装命令
Maven install command with environment variables file
有什么方法可以执行环境变量文件 .env
以及 mvn clean install
或 mvn 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
的这些环境变量。
如有任何帮助,我们将不胜感激。
好的,从您的评论来看,您似乎正在寻找两种不同的解决方案:
- 运行不同环境下的应用
java -DenvFile=/path/<fileName>.env -jar application.jar
- 运行宁测试的解决方案。
这些是不同的问题,我会尝试同时解决这两个问题
第 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
一些相关的
有什么方法可以执行环境变量文件 .env
以及 mvn clean install
或 mvn 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
的这些环境变量。
如有任何帮助,我们将不胜感激。
好的,从您的评论来看,您似乎正在寻找两种不同的解决方案:
- 运行不同环境下的应用
java -DenvFile=/path/<fileName>.env -jar application.jar
- 运行宁测试的解决方案。
这些是不同的问题,我会尝试同时解决这两个问题
第 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
一些相关的