maven - 带有环境变量文件的 Maven 安装命令
问题描述
有什么方法可以执行环境变量文件.env
以及 maven 命令,例如mvn clean install
or mvn clean deploy
。我正在寻找类似解决方案的概念背后的主要思想:
mvn clean install -DenvFile=/path/<filename>.env
或者
mvn clean deploy -DenvFile=/path/<filename>.env
或者
mvn clean package -DenvFile=/path/<filename>.env
注意:不要尝试生成特定于环境的构建。在开发环境中,我打算使用从
<filename>.env
.
其中,上述 maven 命令应设置所有环境变量<filename>.env
,然后执行 maven 插件。在 IntelliJ 中,有一个envFile
完全相同的插件。
不想dev|staging|prod.properties
在我的项目中拥有特定于环境的属性,因为它很混乱且难以管理。我宁愿拥有一个filename.env
包含所有动态/可变属性的单一环境特定文件。
应用程序属性
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
,它就会发挥作用。
我的问题与maven-sure-fire
用于测试的插件有关dev-mode
,它需要这些环境变量用于spring context
.
任何帮助,将不胜感激。
解决方案
好的,从您的评论看来,您正在寻找两种不同的解决方案:
- 在不同的环境中运行应用程序
java -DenvFile=/path/<fileName>.env -jar application.jar
- 运行测试的解决方案。
这些是不同的问题,我将尝试解决这两个问题
第一期
当你运行java -jar
这意味着工件已经组装好(据我了解,在 spring boot maven 插件的帮助下)。这个 jar 是一个准备就绪的 spring boot 应用程序,maven 在这里基本上是无关紧要的——maven 是一个构建系统,spring 是一个运行时框架,我们正在谈论运行时。
Spring Boot 有很多方法可以实现你想要的。与您的情况接近的“本机”弹簧启动方式是使用“--spring.config.location=file://”和所有必需的配置运行应用程序
它看起来像这样(有关完整文档,请参见此处):
java -jar application.jar --spring.config.location=myprops.properties
即使您在src/main/resources/application.properties
此方法中定义了一些属性,也允许有效地覆盖它们,从而提供一种在不同环境中运行不同配置的方法。
这比 .env 文件有一个优势,因为它可以在所有操作系统中以相同的方式运行,甚至在 Windows 中;)因为 Java 是独立于操作系统的——我相信它是你能做到的最好的。
当然,您可以将该java -jar
行包装在某种 bash 脚本中,并在运行 jvm 之前加载/执行一系列export
命令,但同样,它的“spring-y”方式较少。
第 2 期
Maven 以一种与 Spring Boot Maven 插件无关的方式运行测试(单元/集成)。这一切都与万无一失/故障安全和弹簧启动测试框架有关。
我假设您在询问集成测试,因为我认为这与单元测试无关,因为这些根本不需要任何环境变量,并且应该在没有 spring 的情况下运行(junit/mockito 应该可以完成这项工作)
我还将允许自己假设通过 yaml 或属性文件覆盖/配置 Spring Boot 应用程序的方式比 .env 更好,并将在此处提供 Spring 测试配置解决方案:
有了这些假设,您可以在以下路径中创建一个 yaml 文件:src/test/resources/application-test.yml
该文件可以包含与测试相关的配置,并将覆盖任何以src/main/resources/application.yml
. 注意,由于application-test.yml
驻留在测试源中,spring boot maven 插件不会将其打包到应用程序中。
根据进行集成测试的确切方式,您可能还考虑使用@TestPropertySource
注释来提供不遵循 Spring Boot 默认约定的自定义属性/yaml 文件。它对于不使用 spring boot 完整支持引导的 spring 驱动测试特别有用(阅读使用 junit 的 spring runner 但没有注释的测试@SpringBootTest
)
另一个可能有用的注释是@ActiveProfile("myprofile")
. 这将导致 spring boot 测试自动加载文件src/test/resources/application-myprofile.yml
(或application-myprofile.properties
)
最后但并非最不重要的一点是,我将在源代码中引用带有“dev/prod/staging/properties”的第二条评论。说到测试——应该只有一个文件application-test.yml
。但是请注意,当您使用 yaml 时,可以在同一个文件中为许多 Spring Boot 配置文件定义配置:
# default value
foo:
bar: 1
---
spring:
profiles: staging
foo:
bar: 2
---
spring:
profiles: prod
foo:
bar: 3
一些相关的SO线程
推荐阅读
- c# - 如何在 WebBrowser 中搜索页面上的文本?(WPF)
- javascript - 如何在 Apache Echarts 图表上标记一个点?
- gpgpu - 苹果金属内核的变化不会改变执行时间
- javascript - 点击添加视频描述
- artifactory - XRay 使用自签名证书失败
- python - 将数据注册到 json 时出现问题仅注册数字而不是字符串
- javascript - Firebase action.payload 返回 id,但数据未定义
- python - Python在输出每个结果之前打印csv列值而不重复
- ios - 以编程方式自定义 UITabBar 不规则形状
- flutter - 将横向图像转换为肖像(旋转图像)并保存 - Flutter