在Maven中锄俄,主要有3個(gè)插件可以用來(lái)打包:
- maven-jar-plugin浇坐,默認(rèn)的打包插件,用來(lái)打普通的project JAR包仅偎;
- maven-shade-plugin跨蟹,用來(lái)打可執(zhí)行JAR包,也就是所謂的fat JAR包橘沥;
- maven-assembly-plugin窗轩,支持自定義的打包結(jié)構(gòu),也可以定制依賴(lài)項(xiàng)等座咆。
我們?nèi)粘J褂玫囊詍aven-assembly-plugin為最多痢艺,因?yàn)榇髷?shù)據(jù)項(xiàng)目中往往有很多shell腳本、SQL腳本介陶、.properties及.xml配置項(xiàng)等堤舒,采用assembly插件可以讓輸出的結(jié)構(gòu)清晰而標(biāo)準(zhǔn)化。
要使用該插件哺呜,就在項(xiàng)目pom文件中加入以下內(nèi)容舌缤。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven-assembly-plugin.version}<version>
<executions>
<execution>
<id>make-assembly</id>
<!-- 綁定到package生命周期 -->
<phase>package</phase>
<goals>
<!-- 只運(yùn)行一次 -->
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 配置描述符文件 -->
<descriptor>src/main/assembly/assembly.xml</descriptor>
<!-- 也可以使用Maven預(yù)配置的描述符
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs> -->
</configuration>
</plugin>
</plugins>
</build>
assembly插件的打包方式是通過(guò)descriptor(描述符)來(lái)定義的。
Maven預(yù)先定義好的描述符有bin某残,src国撵,project,jar-with-dependencies等玻墅。比較常用的是jar-with-dependencies介牙,它是將所有外部依賴(lài)JAR都加入生成的JAR包中,比較傻瓜化澳厢。
但要真正達(dá)到自定義打包的效果环础,就需要自己寫(xiě)描述符文件,格式為XML剩拢。下面是我們的項(xiàng)目中常用的一種配置线得。
<assembly>
<id>assembly</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/bin</directory>
<includes>
<include>*.sh</include>
</includes>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>src/main/conf</directory>
<outputDirectory>conf</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/sql</directory>
<includes>
<include>*.sql</include>
</includes>
<outputDirectory>sql</outputDirectory>
</fileSet>
<fileSet>
<directory>target/classes/</directory>
<includes>
<include>*.properties</include>
<include>*.xml</include>
<include>*.txt</include>
</includes>
<outputDirectory>conf</outputDirectory>
</fileSet>
</fileSets>
<files>
<file>
<source>target/${project.artifactId}-${project.version}.jar</source>
<outputDirectory>.</outputDirectory>
</file>
</files>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
id與formats
- formats是assembly插件支持的打包文件格式,有zip裸扶、tar框都、tar.gz、tar.bz2呵晨、jar魏保、war∶溃可以同時(shí)定義多個(gè)format谓罗。
- id則是添加到打包文件名的標(biāo)識(shí)符,用來(lái)做后綴季二。
- 也就是說(shuō)檩咱,如果按上面的配置揭措,生成的文件就是${artifactId}-${version}-assembly.tar.gz。
fileSets/fileSet
用來(lái)設(shè)置一組文件在打包時(shí)的屬性刻蚯。
- directory:源目錄的路徑绊含。
- includes/excludes:設(shè)定包含或排除哪些文件,支持通配符炊汹。
- fileMode:指定該目錄下的文件屬性躬充,采用Unix八進(jìn)制描述法,默認(rèn)值是0644讨便。
- outputDirectory:生成目錄的路徑充甚。
files/file
與fileSets大致相同,不過(guò)是指定單個(gè)文件霸褒,并且還可以通過(guò)destName屬性來(lái)設(shè)置與源文件不同的名稱(chēng)伴找。
dependencySets/dependencySet
用來(lái)設(shè)置工程依賴(lài)文件在打包時(shí)的屬性。也與fileSets大致相同废菱,不過(guò)還有兩個(gè)特殊的配置:
- unpack:布爾值技矮,false表示將依賴(lài)以原來(lái)的JAR形式打包,true則表示將依賴(lài)解成*.class文件的目錄結(jié)構(gòu)打包昙啄。
- scope:表示符合哪個(gè)作用范圍的依賴(lài)會(huì)被打包進(jìn)去穆役。compile與provided都不用管,一般是寫(xiě)runtime梳凛。
按照以上配置打包好后,將.tar.gz文件上傳到服務(wù)器梳杏,解壓之后就會(huì)得到bin韧拒、conf、lib等規(guī)范化的目錄結(jié)構(gòu)十性,十分方便叛溢。