由一次打包部署失敗引發的深入探索┑( ̄▽  ̄)┍
一、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:組成項目的唯一定位,當groupId和version是從父級繼承時,則不必顯式定義他們;
packaging:定義打包方式,當前主要的打包方式有pom、 jar、 maven-plugin、 ejb、 war、 ear、 rar,其中jar為默認打包方式;
properties:定義pom常量,pom常量可以在pom文件的任意地方通過${}來引用;
3、構建配置
構建配置分為兩種,"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:定義項目的目錄結構和插件管理;
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
defaultGoal:指定默認的目標或者階段,比如目標可以是jar:jar,階段可以是install,這兩個效果相同;
directory:構建的目標目錄,默認是${basedir}/target;
finalName:項目最終生成的名字,默認是${artifactId}-${version};
filters:定義需要應用的*.properties文件。換句話說就是,在構建時篩選器文件中定義的“name=value”會替換掉資源文件中${name}字符串。Maven的默認篩選器目錄是${basedir}/src/main/filters;
resources:資源列表,描述與項目關聯的文件的內容和位置
<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:定義項目生成后資源文件放置的位置,默認位置是${basedir};
filtering:可選值為true或false,定義是否為此資源啟用篩選。與filters、profile元素結合使用;
directory:定義在哪找到資源文件,默認位置是${basedir}/src/main/resources;
includes:定義directory下需要包含的資源文件,支持*作為通配符匹配文件名;
excludes:結構同includes,定義directory下需要忽略的資源文件,當includes和excludes有沖突時,以excludes為准;
4、環境配置
profiles:根據不同的構建環境更改設置;
<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:描述當前profile激活的條件,當activation里面描述的條件都滿足時,就會激活當前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:是否是默認激活;
jdk:運行環境的jdk版本號;
os:運行環境的操作系統的屬性;
file:哪些文件存在或者哪些文件缺失;
二、第三方依賴jar包打包
Maven項目有時候會遇到有第三方依賴打包的情況,如果這個時候不想deploy到Maven庫上,可以這樣做:
打jar包
1、新建一個目錄用於存放第三方依賴,目錄位置看個人喜好,這里新建lib放在項目根目錄下;
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/下。這里還需要再配置另一個resource,因為添加前面這個配置后會覆蓋掉默認的resource配置導致項目原本的資源文件沒有打進構建生成的包里;
<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步驟需要這樣修改
<!--設置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多環境配置
1、新建一個目錄用於存放filter配置文件,這里新建filters目錄,並存在localhost.properties、test.properties、prod.properties三個環境的配置文件。
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項目使用@name@占位符)來獲取filters中配置文件對應環境的配置值
參考文章:
https://www.jianshu.com/p/574f74d1d0ee
http://maven.apache.org/pom.html
