痛點:
在java開發的過程中,我們經常要面對各種各樣的環境,比如開發環境,測試環境,正式環境,而這些環境對項目的需求也不相同。
在此之前,我們往往需要手動去修改相對應的配置文件然后打成war,才能部署到相應的環境上。
但是這樣很容易出現問題,因為很容易出現少改或者漏改,造成不必要的麻煩
幻想:
要是有一種東西,能讓我們打war的時候指定一個參數,就能自動把項目編譯成對應環境的war,那該有多幸福啊!!!
結果:這樣的東西還真有,那就是maven-profile
一、項目src/main/resources目錄下建立相對應的目錄
比如筆者的
我建立了三個目錄,分別是:dev,test,pro分別表示開發環境,測試環境,生產環境。當然還可能有更多的環境。針對不同的環境,我們的配置文件可能會有不同的設置,比如我的需求是,三個環境的項目常量設置,數據庫連接設置,log設置都可能不同。
那我就分別在三個文件中配置了不同設置,在外面也有三個相對應的文件,其實在開發的過程中外面的三個和dev里面的三個應該是相同的。
公共配置直接放到src/main/resources下
二、POM中的配置
1 <profiles> 2 <!--本地開發環境--> 3 <profile> 4 <id>dev</id> 5 <properties> 6 <profiles.active>dev</profiles.active> 7 </properties> 8 <activation> 9 <activeByDefault>true</activeByDefault> 10 </activation> 11 </profile> 12 <!--測試環境--> 13 <profile> 14 <id>test</id> 15 <properties> 16 <profiles.active>test</profiles.active> 17 </properties> 18 </profile> 19 <!--生產環境--> 20 <profile> 21 <id>pro</id> 22 <properties> 23 <profiles.active>pro</profiles.active> 24 </properties> 25 </profile> 26 </profiles> 27 28 <!--build部分--> 29 <build> 30 <finalName>xxx</finalName> 31 <sourceDirectory>src/main/java</sourceDirectory> 32 <testSourceDirectory>src/test/java</testSourceDirectory> 33 <resources> 34 <resource>
<!--項目的默認資源目錄,但是要排除不必要的文件,想要指定加入的再下面的resource指定-->
35 <directory>${project.basedir}/src/main/resources</directory> 36 <excludes> 37 <exclude>dbpool/**</exclude> 38 <exclude>dev/*</exclude> 39 <exclude>mbg/*</exclude> 40 <exclude>pro/*</exclude> 41 <exclude>test/*</exclude> 42 <exclude>readme.txt</exclude> 43 </excludes> 44 </resource> 45 <resource> 46 <directory>${project.basedir}/src/main/resources/${profiles.active}</directory> 47 <filtering>true</filtering> 48 </resource> 49 <resource> 50 <directory>${project.basedir}/src/main/java</directory> 51 <includes> 52 <include>**/*.xml</include> 53 </includes> 54 <!--是否替換資源中的屬性--> 55 <filtering>true</filtering> 56 </resource> 57 </resources> 58 ... 59 </build>
3~26:我們設置了三個profile分別對應目錄中的三個開發環境。
8~10:開發環境是默認激活的(activeByDefault為true),這樣如果在不指定profile時默認是開發環境
34~44:項目的默認資源目錄,但是要排除不必要的文件,想要指定加入的再下面的resource指定
45~48:根據當前激活的profile來把指定的配置文件加載到classpath下!!橋黑板:filtering標簽一定要有,他的作用就是把src/main/resources的文件替換為dev|test|pro下的文件。(47行)
三、項目編譯生成
所有需要的配置就完成了,通過在運行maven命令時指定不同的profile即可構建不同環境需要的war包或發布到不同的環境了 。如:
clean package -Ppro即構建出生產環境需要的war包
由於默認的profile是dev,所以如果我們不指定profile,那么加載就是開發環境dev下的配置文件了。即我們在本地開發測試時,不用關心profile的問題。
雙擊666,可以愉快的開發了,環境切換,游刃有余。
更詳細的介紹:http://maven.apache.org/pom.html#Profiles
新增筆記:
在idea中設置maven執行命令,若找不到,路徑如下:File->Settings->Keymap->Main menu->Run->Edit Confiturations...也可以自己添加一個快捷鍵,其實就在我們運行tomcat的的那個下拉按鈕下。eclipse的請自行百度 “eclipse執行maven命令”
選好項目目錄,配置好Commang line。然后,我們打包的時候就可以點擊上面的運行按鈕了,愉快的不要不要的。
題外話:在使用maven-3.3.3的打包的時候,有時候會出現如下錯誤
ATAL ERROR in native method: JDWP on raw monitor enter, jvmtiError=JVMTI_ERROR_INVALID_ENVIRONMENT(116) JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on getting class status [../../../src/share/back/util.c:1265] JDWP exit error JVMTI_ERROR_INVALID_ENVIRONMENT(116): on raw monitor enter [../../../src/share/back/util.c:1034] ERROR: JDWP unable to dispose of JVMTI environment: JVMTI_ERROR_INVALID_ENVIRONMENT(116)
其實不影響項目的打包,這是maven,或者是jvm的bug,比如
筆者在更換至maven-3.5.0之后,問題解決!
四:排除WEB-INF下面的文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<warSourceExcludes>WEB-INF/list.html</warSourceExcludes>
</configuration>
</plugin>
碼字不易,尊重原創,轉載請注明:http://www.cnblogs.com/adeng/p/7059588.html