根據環境打包資源文件

一、背景

互聯網和之前的模式是有區別的,之前咱們都是給每一個公司搭建一套系統,買產品那就是還有買一整套的服務器硬件等,而後在內部網絡搭建系統,但是如今互聯網則不同了,咱們只有一套系統,客戶要買咱們的產品,咱們也只是賣服務而已,全部客戶都使用一套系統,由於權限和位置不一樣因此只能看到本身的數據。對於之前的部署方式,由於有不少客戶,每一個客戶的環境都不同,若是咱們項目的配置文件是寫在項目內部的話,那麼要根據不一樣的客戶打不一樣的包,這個太麻煩了,因此就把配置文件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實戰》

相關文章
相關標籤/搜索