开发者

idea多环境配置及问题解决方案

开发者 https://www.devze.com 2023-01-10 10:46 出处:网络 作者: Apple_Web
目录前言项目结构各个配置文件构建Idea切换环境出现的问题SpringBoot问题总结前言
目录
  • 前言
  • 项目结构
  • 各个配置文件
  • 构建
  • Idea切换环境
    • 出现的问题
    • SpringBoot问题
  • 总结

    前言

    正常在企业里面的项目都会有开发环境、测试环境、生产环境,各个环境配置可能都会不一样,我们在构建时,会涉及到环境配置的切换。来回手工修改配置,效率低下,容易出错。

    可以配置多个含有不同环境配置的Profile,在构建时指定构建环境,达到多环境下快速灵活构建的目的。

    下面我们来模拟这种原理。

    项目结构

    idea多环境配置及问题解决方案

    各个配置文件

    filters文件夹下的三个不同环境的配置文件

    dev.properties:

    jdbc.driver.class=com.mysql.http://www.devze.comjdbc.Driver
    jdbc.connection.url=jdbc:mysql://localhost:3306/mydb
    jdbc.username=dev_user
    jdbc.password=dev123456
    
    Redis.host=localhost
    redis.port=6309
    redis.password=dev123456
    

    prod.properties:

    jdbc.driver.class=com.mysql.jdbc.Driver
    jdbc.connection.url=jdbc:mysql://localhost:3306/mydb
    jdbc.username=prod_user
    jdbc.password=prod123456
    
    redis.host=localhost
    redis.port=7309
    redis.password=prod123456
    

    test.properties:

    jdbc.driver.class=com.mysql.jdbc.Driver
    jdbc.connection.url=jdbc:mysql://localhost:3306/mydb
    jdbc.username=test_user
    jdbc.password=test123456
    
    redis.host=localhost
    redis.port=8309
    redis.password=test123456
    

    resources文件下的配置文件

    db.properties:

    jdbc_driver_class=${jdbc.driver.class}
    jdbc_connection_url=${jdbc.connection.url}
    jdbc_username=${jdbc.username}
    jdbc_password=${jdbc.password}
    

    redis.properties:

    redis.host=${redis.host}
    redis.port=${redis.port}
    redis.password=${redis.password}
    

    pom.XML

    标签说明:

    < filters>:

    使用指定的filter进行过滤,在执行mvn命令的时候带上-Ppro就代表生产环境,就会加载生产环境的properties,-Pdev就代表开发环境(默认)

    < resources>< resource>< directory>:

    资源文件位置src/main/resources/,这下面的资源文件的${}会全部被替换成filter中的标签内容。

    directory指定的value会作为classes的资源跟目录,比如指定:src/main/resources/,则classes下会出现config等包,若指定:src/main/resources/config/,则classes下直接编译生成config包下的文件,不会额外出现config等其他包结构。因为他把config作为了根目录

    < finalName>: 打包成jar或者war包的时候的名称,不指定的话就是artifactId+版本号

    <?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>
        <packaging>jar</packaging开发者_Go开发>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <groupId>com.apple</groupId>
        <artifactId>springboot_maven</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
        </dependencies>
    
        <profiles>
            <profile>
                <id>dev</id>
                <properties>
                    <!-- 自定义属性env,在不同环境有不同的值 -->
                    <env>dev</env>
                </properties>
                <activation>
                    <!-- 默认激活dev环境的配置 -->
                    <activeByDefault>true</activeByDefault>
                </activation>
            </profile>
    
       编程客栈     <profile>
                <id>test</id>
                <properties>
                    <env>test</env>
                </properties>
            </profile>
    
            <profile>
                <id>prod</id>
                <properties>
                    <env>prod</envwww.devze.com>
                </properties>
            </profile>
        </profiles>
    
        <build>
           编程客栈 <!--达成jar包的时候的名称-->
            <finalName>${project.artifactId}</finalName>
    
            <!-- 指定filter,根据最终profile下的env属性获取对应的配置文件 -->
            <filters>
                <filter>src/main/filters/${env}.properties</filter>
            </filters>
    
            <!-- 开启资源过滤,让Maven能解析资源文件中的Maven属性 -->
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
    
            <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>utf-8</encoding>
                        <useDefaultDelimiters>true</useDefaultDelimiters>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    构建

    这里先推荐一下idea里面的maven helper插件:可以查看依赖树,排除依赖冲突,这里还有其他作用:比如右键直接RUN Maven使用命令

    idea多环境配置及问题解决方案

    直接右键项目Run Maven即可进行一些命令操作:这里其实就是将一些maven的cmd命令变成了可视化,New Goal可以定制自己的maven命令

    idea多环境配置及问题解决方案

    后面我们要运行test环境,就直接Run这个命令即可!

    idea多环境配置及问题解决方案

    idea多环境配置及问题解决方案

    选择第一个图中的Run compile编译,就会生成target目录,里面生成了对应的编译后的class文件,这里默认是dev环境

    idea多环境配置及问题解决方案

    里面的db.properties和redis.properties都被替换成了对应的值,上面直接Run Compile就是默认的dev环境!

    jdbc_driver_class=com.mysql.jdbc.Driver
    jdbc_connection_url=jdbc:mysql://localhost:3306/mydb
    jdbc_username=dev_user
    jdbc_password=dev123456
    
    redis.host=localhost
    redis.port=6309
    redis.password=dev123456
    

    Idea切换环境

    实际公司项目中,我们会有多个环境,我们其实可以直接点击这个Profiles里面进行切换!

    idea多环境配置及问题解决方案

    我们要切换成prod,这时候就直接勾选即可,我们这时候继续执行Run compile命令,编译后的target就会变成了prod环境的内容

    检查配置有没有生效,编译成功后,可以直接Ctrl+左键点击是可以跳转的对应的环境,并且鼠标悬浮也有值显示

    idea多环境配置及问题解决方案

    出现的问题

    1、有时会切换环境之后,不生效的情况,主要原因是上一个配置换编译target文件夹没有清除;

    解决方法:先clean清除编译文件,再刷新一下maven的配置

    idea多环境配置及问题解决方案

    2、环境不要选择多个,如下图情况,

    只会取最下面的prod配置,dev配置是不生效的

    idea多环境配置及问题解决方案

    SpringBoot问题

    一开始碰到执行后编译后的target目录下.class文件并没有被替换

    idea多环境配置及问题解决方案

     

    原因:

    发现最终是因为springboot导致的,查看其pom继承,

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artizdVyXkrfactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    

    进入后发现,springboot默认指定资源文件中的占位符为@@,并不是maven默认的 ${}

    idea多环境配置及问题解决方案

    idea多环境配置及问题解决方案

     

    解决方案:

    1、将application.properties中的占位符由${key} -> @key@

    2、覆盖springboot的默认规则,在build标签下新增这个plugin标签的内容

    idea多环境配置及问题解决方案

     <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>utf-8</encoding>
                        <useDefaultDelimiters>true</useDefaultDelimiters>
                    </configuration>
                </plugin>
    </plugins>
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号