首页 > 解决方案 > 带有环境变量文件的 Maven 安装命令

问题描述

有什么方法可以执行环境变量文件.env以及 maven 命令,例如mvn clean installor 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.

任何帮助,将不胜感激。

标签: mavenenvironment-variablesmaven-pluginspring-boot-maven-plugin

解决方案


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

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

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

第一期

当你运行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线程


推荐阅读