zoukankan      html  css  js  c++  java
  • 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.test.skip=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

    spring.profiles.active=@profileActive@

    applicatio-dev.properties

    profile=dev_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=qa_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指令不同而替换不通的配置文件

      

    在springboot测试中使用多环境: 

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    @ActiveProfiles("prod")

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

  • 相关阅读:
    第九篇装饰器基本原理
    第八篇迭代器协议和生产器
    python第六篇文件处理类型
    Python开发【第十篇】:模块
    习题练习
    2.2.6 集合
    第七篇 python基础之函数,递归,内置函数
    Python开发【第五篇】:Python基础之杂货铺
    Python开发【第四篇】:Python基础之函数
    详解CSS position属性
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6855973.html
Copyright © 2011-2022 走看看