Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring application properties profile with war file

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>
like image 368
adenix Avatar asked Jul 21 '16 16:07

adenix


People also ask

How do you specify file path in application properties in spring boot?

properties in default location. Spring Boot loads the application. properties file automatically from the project classpath. All you have to do is to create a new file under the src/main/resources directory.

How do I get property properties from spring boot?

Another method to access values defined in Spring Boot is by autowiring the Environment object and calling the getProperty() method to access the value of a property file.

How do I view application properties in Spring?

Another way to read application properties in the Spring Boot application is to use the @ConfigurationProperties annotation. To do that, we will need to create a Plain Old Java Object where each class field matches the name of the key in a property file.


3 Answers

Only use this when you want to deploy.

java -jar -Dspring.profiles.active=<active profile name> <your war file name>.war
like image 81
saeed eivazi Avatar answered Sep 17 '22 17:09

saeed eivazi


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>"
like image 11
Rae Burawes Avatar answered Oct 10 '22 06:10

Rae Burawes


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

like image 5
ihebiheb Avatar answered Oct 10 '22 06:10

ihebiheb