【问题标题】:Spring boot profile based WAR using maven使用 maven 的基于 Spring 引导配置文件的 WAR
【发布时间】:2019-01-14 13:43:09
【问题描述】:

我需要根据特定的环境属性文件创建WAR文件。

所以我创建了 2 个属性文件,

  • application.DEV.properties

  • application.PROD.properties

现在,当我使用 eclipse 嵌入式 tomcat 运行项目时,我将 -Dspring.profiles.active=DEV 作为 VM 参数传递。然后当我点击我的端点时,我可以看到返回的 DEV 相关消息。当我将 PROD 作为参数传递时也是如此。

现在,我想做的是使用 maven 命令创建一个 WAR 文件,并以加载特定属性文件的方式传递参数。所以我参考了 google 和 stackoverflow 并找到了各种选项,如下所示,

  1. mvn clean install -Drun.profiles=DEV
  2. mvn clean install -Drun.jvmArguments="-Dspring.profiles.active=DEV"
  3. mvn clean install -Dspring.profiles.active="DEV"
  4. mvn clean install -Dspring.profiles.active=DEV

以上方法我都试过了。当我点击命令时,会生成 WAR。但它没有部署在 tomcat 上,因为它无法读取属性文件并给出错误。似乎配置文件特定的属性文件没有加载到 WAR 中。

当我想使用 maven 生成 WAR 文件时,我想知道 -Dspring.profiles.active=DEV 的替代方法是什么?

如何生成 WAR 以正确包含适当的配置文件特定属性文件?

我正在使用 spring boot 1.5.14.RELEASE。

【问题讨论】:

  • 好像是资源目录的问题。您可以使用完整路径资源文件夹编辑您的 POM。 to/your/resource
  • 你好。我认为您混淆了 Spring 配置文件和 Maven 配置文件。如果您想基于配置文件构建和/或部署包,您应该使用 Maven 配置文件而不是 Spring 配置文件。
  • 所有步骤(1.-4.)都很好,但仅适用于“mvn clean install”(运行)。我记得根据环境(prod、dev、int、..)构建(不同的)工件是“不好的做法”。但是你可以这样做(例如使用“maven 配置文件”)..激活弹簧配置文件,您必须在运行时设置相应的属性(使用-Dspring.profiles.active=... 启动tomcat(或其他))

标签: java maven spring-boot deployment war


【解决方案1】:

您必须将spring.profiles.active 传递给运行时,而不是“构建运行时”。在构建时需要的唯一弹簧配置文件将用于测试目的。

如果出现“对Tomcat的战争”,可以设置spring.profiles.active:

  1. (全局)在<tomcat_home>/bin/ 中创建一个名为setnev.sh 的文件(分别为.bat,当您在Windows 机器上时):

    export JAVA_OPTS="-Dspring.profiles.active=PROFILE_OF_THIS_TOMCAT"
    

    分别:

    set JAVA_OPTS="-Dspring.profiles.active=PROFILE_OF_THIS_TOMCAT"
    
  2. (全局)向<tomcat_home>/conf/catalina.properties添加一行:

    spring.profiles.active=PROFILE_OF_THIS_TOMCAT
    
  3. (在容器级别)在$CATALINA_BASE/conf/[enginename]/[hostname]/ 处添加一个名为context.xml 的文件(您也可以将其放入/<webapp_root>/META-INF/,但是您必须在构建时进行区分),内容如下:

    <Context>
     <Environment name="spring.profiles.active" value="PROFILE_OF_THIS_TOMCAT" /> 
    </Context>
    

【讨论】:

    【解决方案2】:

    正如 Mickael 对此答案的评论,您可以从 maven 文档中获得有关如何使用配置文件的帮助:https://maven.apache.org/guides/introduction/introduction-to-profiles.html

    使用 maven 选择配置文件的常用方法是

    mvn -Pprod package
    

    prod 是您的个人资料的名称。如果您想使用开发配置文件进行构建,那将是

    mvn -Pdev package
    

    此类配置文件在project&gt;profiles&gt;profile 下的文件pom.xml 中定义。在那个地方,您可以指定打包选项。

    这是这样的个人资料:

    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <properties>
            <!-- log configuration -->
            <logback.loglevel>DEBUG</logback.loglevel>
            <!-- default Spring profiles -->
            <spring.profiles.active>dev${profile.no-liquibase}</spring.profiles.active>
        </properties>
    </profile>
    

    【讨论】:

    • “mvn clean install -Pdev”是“mvn clean install -Dspring.profiles.active=dev”的替代品吗?
    • 我不习惯您使用的语法并且不习惯(下一条评论说不习惯)。我已经用配置文件定义完成了我的回答。
    • mvn clean install -Pdev 不是 mvn clean install -Dspring.profiles.active=dev 的替代品
    • @Mickael 然后使用 maven 创建该 WAR 以选择特定配置文件的方式应该是什么?
    • 你应该使用这个答案。这是完整的文档:maven.apache.org/guides/introduction/…
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多