由一次打包部署失敗引發(fā)的深入探索┑( ̄▽  ̄)┍
一修赞、Maven配置
1婶恼、概覽
<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>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
2、基本配置
groupId+artifactId+version:組成項(xiàng)目的唯一定位,當(dāng)groupId和version是從父級繼承時(shí)勾邦,則不必顯式定義他們蚣录;
packaging:定義打包方式,當(dāng)前主要的打包方式有pom眷篇、 jar萎河、 maven-plugin、 ejb铅歼、 war公壤、 ear换可、 rar椎椰,其中jar為默認(rèn)打包方式;
properties:定義pom常量沾鳄,pom常量可以在pom文件的任意地方通過${}來引用慨飘;
3、構(gòu)建配置
構(gòu)建配置分為兩種译荞,"Project Build"和"Profile Build"
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
build:定義項(xiàng)目的目錄結(jié)構(gòu)和插件管理瓤的;
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
defaultGoal:指定默認(rèn)的目標(biāo)或者階段,比如目標(biāo)可以是jar:jar吞歼,階段可以是install圈膏,這兩個(gè)效果相同;
directory:構(gòu)建的目標(biāo)目錄篙骡,默認(rèn)是${basedir}/target稽坤;
finalName:項(xiàng)目最終生成的名字,默認(rèn)是${artifactId}-${version}糯俗;
filters:定義需要應(yīng)用的*.properties文件尿褪。換句話說就是,在構(gòu)建時(shí)篩選器文件中定義的“name=value”會替換掉資源文件中${name}字符串得湘。Maven的默認(rèn)篩選器目錄是${basedir}/src/main/filters杖玲;
resources:資源列表,描述與項(xiàng)目關(guān)聯(lián)的文件的內(nèi)容和位置
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
...
</build>
targetPath:定義項(xiàng)目生成后資源文件放置的位置淘正,默認(rèn)位置是${basedir}摆马;
filtering:可選值為true或false,定義是否為此資源啟用篩選鸿吆。與filters囤采、profile元素結(jié)合使用;
directory:定義在哪找到資源文件伞剑,默認(rèn)位置是${basedir}/src/main/resources斑唬;
includes:定義directory下需要包含的資源文件,支持*作為通配符匹配文件名;
excludes:結(jié)構(gòu)同includes恕刘,定義directory下需要忽略的資源文件缤谎,當(dāng)includes和excludes有沖突時(shí),以excludes為準(zhǔn)褐着;
4坷澡、環(huán)境配置
profiles:根據(jù)不同的構(gòu)建環(huán)境更改設(shè)置;
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
activation:描述當(dāng)前profile激活的條件含蓉,當(dāng)activation里面描述的條件都滿足時(shí)频敛,就會激活當(dāng)前profile;
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>sparrow-type</name>
<value>African</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
...
</profile>
</profiles>
activeByDefault:是否是默認(rèn)激活馅扣;
jdk:運(yùn)行環(huán)境的jdk版本號斟赚;
os:運(yùn)行環(huán)境的操作系統(tǒng)的屬性;
file:哪些文件存在或者哪些文件缺失差油;
二拗军、第三方依賴jar包打包
Maven項(xiàng)目有時(shí)候會遇到有第三方依賴打包的情況,如果這個(gè)時(shí)候不想deploy到Maven庫上蓄喇,可以這樣做:
打jar包
1发侵、新建一個(gè)目錄用于存放第三方依賴,目錄位置看個(gè)人喜好妆偏,這里新建lib放在項(xiàng)目根目錄下刃鳄;
2、pom文件中添加依賴钱骂;
<dependency>
<groupId>xx</groupId>
<artifactId>xx</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/xx-xx-2.0.jar</systemPath>
</dependency>
3叔锐、在pom文件的build元素下添加resource配置,目的是將lib里的第三方依賴打到BOOT-INF/lib/下罐柳。這里還需要再配置另一個(gè)resource掌腰,因?yàn)樘砑忧懊孢@個(gè)配置后會覆蓋掉默認(rèn)的resource配置導(dǎo)致項(xiàng)目原本的資源文件沒有打進(jìn)構(gòu)建生成的包里;
<resources>
<resource>
<directory>lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
打war包
1张吉、2步驟同jar包齿梁,3步驟需要這樣修改
<!--設(shè)置maven-war-plugins插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>lib</directory>
<targetPath>WEB-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
三、Profiles多環(huán)境配置
1肮蛹、新建一個(gè)目錄用于存放filter配置文件勺择,這里新建filters目錄,并存在localhost.properties伦忠、test.properties省核、prod.properties三個(gè)環(huán)境的配置文件。
2昆码、pom文件中添加profiles配置
<profiles>
<profile>
<id>localhost</id>
<properties>
<profiles.active>localhost</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
3气忠、pom文件中的build元素下添加配置
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<filters>
<filter>${basedir}/filters/${profiles.active}.properties</filter>
</filters>
4邻储、${basedir}/src/main/resources目錄下編寫總配置文件,使用${name}占位符(SpringBoot項(xiàng)目使用@name@占位符)來獲取filters中配置文件對應(yīng)環(huán)境的配置值
參考文章:
http://www.reibang.com/p/574f74d1d0ee
http://maven.apache.org/pom.html