Spring application properties profile with war file

24,073

Solution 1

You can define the spring profiles through the following:

web.xml

<context-param>
 <param-name>spring.profiles.active</param-name>
 <param-value>your target profile here</param-value>
</context-param>

setenv.sh

Under your Tomcat's bin folder create setenv.sh file with the following content:

JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=<your target profile here>"

Solution 2

To package the project according to a pre defined profile, you need to do this :

  1. In your application.properties, add

    [email protected]@

  2. In your POM, add this :

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
  1. and define your profiles (just like what you did)

  2. run the command mvn package -P QA

You will see that in the generated WAR, in the application.properties, [email protected]@ will be replaced with spring.profiles.active=QA

Solution 3

Only use this when you want to deploy.

java -jar -Dspring.profiles.active=<active profile name> <your war file name>.war

Solution 4

Have you tried this?

java -jar -Dspring.profiles.active=qa yourwarfilename.war

For packaging, you can create profiles like this and call this profile while building it via $mvn package -P QA:

<profiles>
  <profile>
    <id>QA</id>
    <properties>
      <spring.profiles.active>qa</spring.profiles.active>
    </properties>
  </profile>
</profiles>
Share:
24,073
adenix
Author by

adenix

Updated on July 05, 2022

Comments

  • adenix
    adenix almost 2 years

    I am trying to package my project in a .war for a tomcat server deployment. I need the ability to use my application.properties OR application-dev.properties OR appliation-qa.properties OR application-prod.properties. Running the project with the embeded servlet I am able to specify via the command line which one I want to use, but, the project always uses application.properties when I package it as a .war.

    I use the following commands to run my project locally:

    1. mvn spring-boot:run
    2. mvn spring-boot:run -Drun.arguments="--spring.profiles.active=dev"

    And this command to package my project though bamboo for deployment:

    • mvn package -Dspring.profiles.active=qa


    Application.java

        package com.pandera.wilson;
    
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.builder.SpringApplicationBuilder;
        import org.springframework.boot.context.web.SpringBootServletInitializer;
        import org.springframework.context.annotation.ComponentScan;
        import org.springframework.core.env.AbstractEnvironment;
        import org.springframework.scheduling.annotation.EnableAsync;
        import org.springframework.scheduling.annotation.EnableScheduling;
    
        import javax.servlet.ServletContext;
        import javax.servlet.ServletException;
    
        import org.apache.log4j.Logger;
    
        /**
         * @author Gaurav Kataria
         * @author Austin Nicholas
         * @category Application
         */
    
        @SpringBootApplication
        @ComponentScan(basePackages = { "com.pandera.wilson" })
        @EnableAsync
        public class Application extends SpringBootServletInitializer {
    
            static final Logger logger = Logger.getLogger(Application.class);
    
            public static void main(String[] args) throws Exception {
    
                logger.info("Entering Application");
                SpringApplication.run(Application.class, args);
            }
    
            @Override
            protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
                return application.sources(Application.class);
            }
    
        }
    


    pom.xml

        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
    
            <groupId>org.springframework</groupId>
            <artifactId>wilson</artifactId>
            <version>3.0.1</version>
    
            <packaging>war</packaging>
    
            <properties>
                <java.version>1.8</java.version>
                <start-class>com.pandera.wilson.Application</start-class>
            </properties>
    
            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>1.3.6.RELEASE</version>
            </parent>
    
            <build>
                <finalName>wilson-services</finalName>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                    </plugin>
                </plugins>
            </build>
    
            <dependencies>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-logging</artifactId>
                        </exclusion>
                        <exclusion>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-log4j12</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-log4j</artifactId>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
                    <scope>test</scope>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-thymeleaf</artifactId>
                </dependency>
    
                <dependency>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>httpclient</artifactId>
                    <version>4.5.2</version>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-security</artifactId>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework.security.oauth</groupId>
                    <artifactId>spring-security-oauth2</artifactId>
                </dependency>
    
                <dependency>
                    <groupId>com.microsoft.sqlserver</groupId>
                    <artifactId>sqljdbc4</artifactId>
                    <version>4.0</version>
                </dependency>
    
                <dependency>
                    <groupId>org.json</groupId>
                    <artifactId>json</artifactId>
                    <version>20160212</version>
                </dependency>
    
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>2.4</version>
                </dependency>
    
                <dependency>
                    <groupId>com.microsoft.azure</groupId>
                    <artifactId>azure</artifactId>
                    <version>1.0.0-beta2</version>
                </dependency>
    
            </dependencies>
    
            <repositories>
                <repository>
                    <id>spring-releases</id>
                    <url>https://repo.spring.io/libs-release</url>
                </repository>
            </repositories>
    
        </project>
    


    EDIT 1:30PM 7-21-16

    I've added the following to my pom.xml and tried packaging with mvn package -P PROD, however, when I hit /about I still see that I'm using appliation.properties instead of application-prod.properties.

    <profiles>
        <profile>
            <id>QA</id>
            <properties>
                <spring.profiles.active>qa</spring.profiles.active>
            </properties>
        </profile>
    
        <profile>
            <id>DEV</id>
            <properties>
                <spring.profiles.active>dev</spring.profiles.active>
            </properties>
        </profile>
    
        <profile>
            <id>PROD</id>
            <properties>
                <spring.profiles.active>prod</spring.profiles.active>
            </properties>
        </profile>
    </profiles>
    
  • adenix
    adenix almost 8 years
    This does start the .war using the specified profile but I need to deploy the .war into tomcat
  • krmanish007
    krmanish007 almost 8 years
    I have updated the answer, lets see if that solve your issue
  • adenix
    adenix almost 8 years
    I'm using Spring Boot so I don't have a web.xml. Also I need to be able to specify my profile via command line when the project is packaged.
  • adenix
    adenix almost 8 years
    This looked promising but it still packaged with the fallback file
  • adenix
    adenix almost 8 years
    Also, I don't have access to the dev and qa servers to change the tomcat setup.
  • adenix
    adenix almost 8 years
    I updated the question with what I added an how I tried to package the project.
  • adenix
    adenix almost 8 years
    After some testing it seems that my maven profiles aren't being selected with -P PROD
  • krmanish007
    krmanish007 almost 8 years
    I think stackoverflow.com/questions/11869064/… will answer your question
  • Rae Burawes
    Rae Burawes almost 8 years
    Oh I see. I think spring.profiles.default might help you.