根据环境打包资源文件

一、背景

互联网和之前的模式是有区别的,之前咱们都是给每一个公司搭建一套系统,买产品那就是还有买一整套的服务器硬件等,而后在内部网络搭建系统,但是如今互联网则不同了,咱们只有一套系统,客户要买咱们的产品,咱们也只是卖服务而已,全部客户都使用一套系统,由于权限和位置不一样因此只能看到本身的数据。对于之前的部署方式,由于有不少客户,每一个客户的环境都不同,若是咱们项目的配置文件是写在项目内部的话,那么要根据不一样的客户打不一样的包,这个太麻烦了,因此就把配置文件ini放在了某个固定的路径下面,使配置文件和项目解耦,客户能够本身使用配置文件配置;回到如今,由于咱们项目部署在云端,通常状况下就部署一处搞定,而后再细分环境就是 生产环境、测试环境、开发环境,因此只要根据这3个不一样的环境打3次包便可,那么就不必把配置文件放在项目外部了,而是放在项目内部,使用项目 Maven 管理。java


二、分析

使用Maven根据不一样环境打包,maven项目都会有 src/main/java  src/main/resourcesmysql

前者存放的是java源文件,默认打包在 classes 目录下面,可是若是该目录下面还有非java的文件,系统默认是不会打包的,这个时候除非本身指定POM文件打包规则sql

后面存放的是配置文件,一样maven默认打包在classes目录下,默认是全部文件,因此,若是想要部分文件不打包,大家也要本身指定POM文件打包规则。apache


三、实现

规则——核心资源过滤服务器

1)项目目录结构网络

src/main/javaapp

    |-LoginServlet.javamaven

    |-UserMapper.xml单元测试

src/main/resources测试

    |-config

            |-jdbc.properties

    |-enviroment

            |-dev.properties

            |-product.properties

            |-test.properties


2)jdbc.propertes 文件内容

driverClassName=${driverClassName}

jdbc_url=${jdbc_url}

jdbc_user=${jdbc_user}

jdbc_password=${jdbc_password}


3)修改pom文件

................

<build>

            <!-- 单元测试,忽略 Tests are skipped -->

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-surefire-plugin</artifactId>

                <version>2.5</version>

                <configuration>

                    <skip>true</skip>

                </configuration>

            </plugin>

        <!-- 配置文件,,resources 目录则刚好相反 -->

        <resources>

            <!-- 若是在java目录下有资源文件,须要明确声明打包才能部署到classes目录  -->

            <resource>  

                <directory>src/main/java</directory>  

                <includes>  

                    <include>**/*.properties</include>  

                    <include>**/*.xml</include>  

                </includes>  

                <filtering>false</filtering>  

            </resource> 

             <!-- 若是在resouces目录下有资源文件,须要明确声明打包才能不部署到classes目录  -->

            <resource>

                <directory>src/main/resources</directory>

                <filtering>false</filtering>

                <includes>

                    <include>**/*.*</include>

                </includes>

                <excludes>

                    <exclude>environment/*.properties</exclude>

                </excludes>

            </resource>

            <resource>

                <directory>src/main/resources</directory>

                <filtering>true</filtering>

                <includes>

                    <include>**/*.properties</include>

                </includes>

            </resource>

        </resources>

    </build>

    <!-- 配置选项 dev 开发环境(默认使用),test 测试环境,product 生产环境 -->

    <profiles>

        <profile>

            <id>dev</id>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

            <properties>

                <driverClassName>com.mysql.jdbc.Driver</driverClassName>

                <jdbc_url>jdbc:mysql://localhost:3306/develop</jdbc_url>

                <jdbc_user>learnmore</jdbc_user>

                <jdbc_password>learnmore</jdbc_password>

            </properties>

        </profile>

        <profile>

            <id>product</id>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

            <properties>

                <!-- 使用自定义属性的方式 -->

                <driverClassName>com.mysql.jdbc.Driver</driverClassName>

                <jdbc_url>jdbc:mysql://localhost:3306/product</jdbc_url>

                <jdbc_user>learnmore</jdbc_user>

                <jdbc_password>learnmore</jdbc_password>

            </properties>

        </profile>

        <profile>

            <id>test</id>

            <build>

                <filters>

                    <!-- 使用独立文件的方式 -->

                    <filter>src/main/resources/environment/test.properties</filter>

                </filters>

            </build>

        </profile>

    </profiles>

不管是src/main/java 仍是 src/main/resources 他们均可以放资源文件,在pom中均可以设置属性 include 和 exclude ,不要觉得 include和exclude就是部署时是否包含,其实还有另外的意思,他们更关键的是配合另外一个属性 filtering 使用,filtering 为 true 说明 include 的文件会被资源过滤,也就是这些文件内部的占位符 ${jdbc_url} 会被 profiles 中指定的 properties 替换掉,打包以后你就能够打开war包看到效果。然而打包部署的话,是有默认规则的,就是上面说的,若是是在 src/main/java 目录下,非java文件默认不打包,可是若是在pom中声明要include,那么这部分就会打包;若是是 src/main/resource 目录下,全部的文件都默认打包在classes目录,可是若是在pom中声明要exclude,那么这部分就不打包。看上面的配置你会发现,resources目录下指定了多个 resource ,第一个是用来声明须要部署哪些文件,第二个用来声明哪些文件须要过滤。

4)上面默认是激活dev配置,咱们也能够在打包时采用参数激活自定义的文件

mvn clean package

mvn clean package -Pdev

mvn clean package -Pproduct

mvn clean package -Ptest


打包以后,找到war包,而后查看文件,会发现占位符已经被替换。

jdbc.propertes 文件内容

driverClassName=com.mysql.jdbc.Driver

jdbc_url=jdbc:mysql://localhost:3306/product

jdbc_user=learnmore

jdbc_password=learnmore


四、注意

对于profile激活机制仍是有不少的,这个能够参考《Mavn实战》

对于maven属性自定义以及系统maven属性,均可以参考 《Mavn实战》

相关文章
相关标签/搜索