springboot-21-maven多环境打包

前几天项目需要用到分环境打包, 于是研究了下, 由于项目基于springboot的, 所以分两个情况进行说明:

1), springboot的多环境配置

2), maven-springboot的多环境配置

项目gitHub地址: https://github.com/wenbronk/springboot-maven-profile

1, springboot的环境配置比较简单, yml和properties的配置相似, 不同的是, yml只需要在同一个文件中, properties需要3个不同的文件, 分别说明:

1) pom.xml 文件:

<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>com.wenbronk</groupId>
    <artifactId>springboot-profiles</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- 添加父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
    </parent>

    <!-- 锁定jdk版本 -->
    <properties>
        <!-- 指定启动类(main方法的位置) -->
        <start-class>com.wenbronk.App</start-class>
        <java.version>1.8</java.version>
        <!-- 构建编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>

        <!-- exclude掉spring-boot的默认log配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- spring-boot的web启动的jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 为了构建一个即是可执行的,又能部署到一个外部容器的war文件,你需要标记内嵌容器依赖为"provided" -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- 引入log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- 加上这个才能辨认到log4j2.yml文件 -->
        <dependency>  <!-- 加上这个才能辨认到log4j2.yml文件 -->
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.15</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-profiles</finalName>
    </build>

</project>

2, application.yml

spring:
  profiles:
    active: dev

# 开发环境
---
spring:
  profiles: dev

server:
  port: 8090

my:
  properties:
    abc: devdevdev


# 测试环境配置
---
spring:
  profiles: qa

server:
  port: 8000

my:
  properties:
    abc: devdevdev


# 生产环境配置
---
spring:
  profiles: prod
server:
  port: 8000

my:
  properties:
    abc: devdevdev

 
 

3, 编写一个类测试:

App.java

package com.wenbronk.maven;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class App extends SpringBootServletInitializer {

    /**
     * war使用
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }

    /**
     * jar使用
     * @param args
     * @throws Exception
     * @time 2017年5月15日
     */
    public static void main(String[] args) throws Exception {
        SpringApplication.run(App.class, args);
    }

}

TestController.java

package com.wenbronk.maven.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.wenbronk.maven.config.TestConfig;

/**
 * 测试多环境部署
 *
 * @author wenbronk
 * @time 2017年5月12日
 */
@RestController
public class TestController {

     @Autowired
     private Environment env;

     @Autowired
     private TestConfig testConfig;

    /**
     *
     * @return
     * @time 2017年5月12日
     */
    @RequestMapping(value="/test")
    public String test() {
        System.out.println("connect success");
        String property = env.getProperty("profile");
        System.out.println("property   " + property);

        String abc = testConfig.getAbc();
        System.out.println(abc);

        return "sucess";
    }

}

TestConfig.java

package com.wenbronk.maven.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.wenbronk.maven.config.TestConfig;

/**
 * 测试多环境部署
 *
 * @author wenbronk
 * @time 2017年5月12日
 */
@RestController
public class TestController {

     @Autowired
     private Environment env;

     @Autowired
     private TestConfig testConfig;

    /**
     *
     * @return
     * @time 2017年5月12日
     */
    @RequestMapping(value="/test")
    public String test() {
        System.out.println("connect success");
        String property = env.getProperty("profile");
        System.out.println("property   " + property);

        String abc = testConfig.getAbc();
        System.out.println(abc);

        return "sucess";
    }

}

此时启动端口可以看到由yml衷配置文件所制定的配置生效

2 maven-springboot

上面的配置有时候并不能满足我们的需要, 比如 db.properites, 不通的环境需要打包不同文件夹下的配置文件, 这时候还需要maven的打包方式

mvn clean package -Dmaven.skip.test=true -P dev -e

1, pom.xml的配置

<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>com.wenbronk</groupId>
    <artifactId>springboot-profiles-maven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <properties>
        <start-class>com.wenbronk.profile.App</start-class>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- exclude掉spring-boot的默认log配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- spring-boot的web启动的jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 为了构建一个即是可执行的,又能部署到一个外部容器的war文件,你需要标记内嵌容器依赖为"provided" -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- 引入log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- 加上这个才能辨认到log4j2.yml文件 -->
        <dependency>  <!-- 加上这个才能辨认到log4j2.yml文件 -->
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- springboot 热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>qa</id>
            <properties>
                <profileActive>qa</profileActive>
            </properties>
        </profile>
    </profiles>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>dev_conf/*</exclude>
                    <exclude>qa_conf/*</exclude>
                </excludes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources/${profileActive}_conf</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 如果没有这个, 不生效 -->
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2, src/main/resources/文件夹下放置不同环境的配置文件:

这儿使用application.properites, 使用yml就用上面那种方式

application.properties

[email protected]@

applicatio-dev.properties

profile=qa_enviroment
server.port=9000

my.properties.abc=devdevdev

application-prod.properties

profile=prod_enviroment
server.port=8000
my.properties.abc=prodprodprod

application-qa.properties

profile=dev_enviroment
server.port=7000
my.properties.abc=qaqaqaqa

3, 放置不同的 conf 下

---  dev_conf/db.properties

---  qa_conf/db.properties

qwer=123

4, 接下来是程序编码

App.java, 在这儿为了区分, 在日志中将 使用的配置文件信息打印出来

package com.wenbronk.profile;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App extends SpringBootServletInitializer {

    /**
     * war使用
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }

    /**
     * jar使用
     * @param args
     * @throws Exception
     * @time 2017年5月15日
     */
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        String[] activeProfiles = context.getEnvironment().getActiveProfiles();
        for (String profile : activeProfiles) {
            System.out.println("Spring Boot 使用profile为:" + profile);
        }
    }
}

TestConfig.java , 用于读取application-xxx.properties中的信息

package com.wenbronk.profile.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my.properties")
public class TestConfig {
    private String abc;

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }
}

ResourceLoader.java, 读取外部资源文件

package com.wenbronk.profile.resource;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

/**
 * 实现resourceLoaderAware , 加载外部资源文件
 *
 * @author wenbronk
 * @time 2017年5月15日
 */
@Component
public class MyResourceLoader implements ResourceLoaderAware{

    private ResourceLoader resourceLoader;

    public Resource getresourceLoader(String path) {
        return resourceLoader.getResource("classpath:" + path);
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

}

controller.java测试

package com.wenbronk.profile.controller;

import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.wenbronk.profile.config.TestConfig;
import com.wenbronk.profile.resource.MyResourceLoader;

/**
 * 测试springboot-maven 分环境打包
 *
 * @author wenbronk
 * @time 2017年5月15日
 */
@RestController
public class TestController {

    /**
     * 可直接使用environment来配置
     */
     @Autowired
     private Environment env;

    @Autowired
    private TestConfig testConfig;

    @Autowired
    private MyResourceLoader resourceLoader;

    @RequestMapping("/test")
    public String test() throws IOException {
        String abc = testConfig.getAbc();
        System.out.println(abc);

        String property = env.getProperty("profile");
        System.out.println("property   " + property);

        Resource resource = resourceLoader.getresourceLoader("db.properties");
        String string = IOUtils.toString(resource.getInputStream(), "utf-8");
        System.out.println(string);
        return abc;
    }

}

运行后可以根据输入命令更改配置

为了进一步验证, 我们分别打 了war包和jar包, 可以看到根据输入的maven指令不同而替换不通的配置文件

原创地址: http://www.cnblogs.com/wenbronk/p/6855973.html, 转载请注明出处, 谢谢

时间: 2024-11-05 22:52:20

springboot-21-maven多环境打包的相关文章

maven多环境打包配置

一.需求场景 1.开发环境和生产环境数据库地址和信息不同. 2.开发和生产日志等级不同 ... 二.最简单的实现方式 在 pom.xml 中配置 <!-- 设置不同环境打包 --> <profiles> <profile> <id>dev</id> <properties> <db.url>aa1</db.url> <db.username>bb1</db.username> <d

maven 分环境打包

一,创建分环境属性配置文件 src/build-config/build-develop.propertiessrc/build-config/build-product.propertiessrc/build-config/build-test.properties 例: build-develop.properties #数据库配置build.jdbc.url = jdbc:oracle:thin:@ip:port:databasebuild.jdbc.username = namebuil

Maven多环境打包

1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVe

maven 多环境打包

1.在项目的pom中添加 <build>     <resources>         <!-- Resource Filter -->         <resource>             <directory>src/main/resources</directory>             <filtering>true</filtering>         </resource>

Maven 多环境 打包

1.pom.xml文件添加profiles属性 <profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> <property> <name>env</name> <value>dev</value> </property> </ac

Maven 结合 Spring profile对不同的部署环境打包部署

这是一个草鸡鸡冻人心的时刻,搞了2天终于搞定了,麻麻再也不用担心我部署出错了!!!!!!! 所有profile,spring和maven的,定义均要一致,否则,自己运行看看. 首先,先来讲下spring的profile功能,这个是方便项目的各种环境分离(开发.测试.生产),简单介绍下如何使用. 在beans中定义环境代码,项目中,我在beans.xml里定义 1 <beans profile="develop,test,product"></beans> 在数据

SpringBoot项目使用maven-assembly-plugin根据不同环境打包成tar.gz

spring-boot-assembly 在spring boot项目中使用maven profiles和maven assembly插件根据不同环境打包成tar.gz或者zip 将spring boot项目中的配置文件提取到外部config目录中 将spring boot项目中的启动jar包移动到boot目录中 将spring boot项目中的第三方依赖jar包移动到外部lib目录中 bin目录中是启动,停止,重启服务命令 打包后的目录结构类似于tomcat/maven目录结构 GITHUB项

springboot不同环境打包

1. 场景描述 springboot+maven打包,项目中经常用到不同的环境下打包不同的配置文件,比如连接的数据库.配置文件.日志文件级别等都不一样. 2. 解决方案 在pom.xml文件中定义 2.1 真实代码 <project> <dependencies> </dependencies> <profiles> <profile> <id>dev</id> <activation> <activeB

Maven插件之portable-config-maven-plugin(不同环境打包)

大型项目中,分开发环境.测试环境.生产环境等; 不同环境,配置不同,或数据源,或服务器,或数据库等; 问题来了,如何使用Maven针对不同的环境来打包呢? Maven提供了Profile的概念,用来解决此类问题,其原理很简单,就是使用变量替换;举个例子来说明,测试项目目录结构如下图所示: 比如开发环境和生产环境的数据库不同,db.properties配置文件内容如下: [html] view plain copy #测试库 db.url=192.10.2.168 db.username=dbte

spring-boot分环境打包为tar包

1.pom配置 <!-- 多环境打包 start --> <profiles> <!-- 开发环境配置 --> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> <activation> <activeByDefault>true<