maven--插件篇(assembly插件)

1. 簡介

簡單的說,maven-assembly-plugin 就是用來幫助打包用的,比如說打出一個什麼類型的包,包裏包括哪些內容等等。

2. 常見的maven插件

maven插件是在生命週期中某些階段執行的任務。一個插件完成一項功能。以下介紹幾種常見的插件。
如對於打包來說,有多種插件選擇。最常見的有以下3個:

plugin function
maven-jar-plugin maven 默認打包插件,用來創建 project jar
maven-shade-plugin 用來打可執行包,executable(fat) jar
maven-assembly-plugin 支持定製化打包方式,例如 apache 項目的打包方式

以下選取幾個常見插件介紹。

maven-compiler-plugin

編譯Java源碼,一般只需設置編譯的jdk版本

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

或者在properties設置jdk版本

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

maven-jar-plugin

打成jar時,設定manifest的參數,比如指定運行的Main class,還有依賴的jar包,加入classpath中

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>/data/lib</classpathPrefix>
                <mainClass>com.zhang.spring.App</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

tomcat7-maven-plugin

用於遠程部署Java Web項目

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <url>http://59.110.162.178:8080/manager/text</url>
        <username>linjinbin</username>
        <password>linjinbin</password>
    </configuration>
</plugin>

maven-shade-plugin

用於把多個jar包,打成1個jar包
一般Java項目都會依賴其他第三方jar包,最終打包時,希望把其他jar包包含在一個jar包裏。
與assembly類似,使用assembly即可。以下詳解assembly。

3. maven-assembly-plugin

1.在pom中引入插件

1.首先我們需要在pom.xml中配置maven的assembly插件

 <build>
    <plugins>
        <plugin>       
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
              
              <execution><!-- 配置執行器 -->
              <id>make-assembly</id>
                <phase>package</phase><!-- 綁定到package生命週期階段上 -->
                (1)
                <goals>
                  <goal>single</goal><!-- 只運行一次 -->   
                </goals>
                
                (2)
                <configuration>
                  <finalName>${project.name}</finalName>
                  <!--主類入口等-->
                  ...
                  
                  <descriptor>src/main/assembly/assembly.xml</descriptor><!--配置描述文件路徑--> 
                </configuration>
              
              </execution>
            </executions>
          </plugin>
        </plugins>
     </build>

2.兩個主要的參數設置(上述中的(1)(2))

I) Assembly插件的goals

  • single
  • help

可以執行如下命令完成動作:

mvn assembly:single

或者是,綁定到package生命週期階段上(見上配置)觸發。後續可以直接執行:

mvn package

這也是最常見的Assembly插件配置方式。

II)Assembly descriptor

Assembly Descriptor可以使用內置的,或者定製的。

(1) 使用內置的Assembly Descriptor

要使用maven-assembly-plugin,需要指定至少一個要使用的assembly descriptor 文件。默認情況下,maven-assembly-plugin內置了幾個可以用的assembly descriptor:

  • bin : 類似於默認打包,會將bin目錄下的文件打到包中;
  • jar-with-dependencies : 會將所有依賴都解壓打包到生成物中;
  • src :只將源碼目錄下的文件打包;
  • project : 將整個project資源打包。

使用 descriptorRefs來引用(官方提供的定製化打包方式)【不建議使用】

<plugin>  
    <artifactId>maven-assembly-plugin</artifactId>  
    <configuration>  
    
        <descriptorRefs>  
            <descriptorRef>jar-with-dependencies</descriptorRef>  
        </descriptorRefs>  
    </configuration>  
</plugin>

上述直接配置jar-with-dependencies打包方式。不需要引入額外文件。實際上,上述4中預定義的assembly descriptor有對應的xml。要查看它們的詳細定義,可以到maven-assembly-plugin.jar裏去看,例如對應 bin 的assembly descriptor 原始文件如下:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>bin</id>
    <formats>
        <format>tar.gz</format>
        <format>tar.bz2</format>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>README*</include>
                <include>LICENSE*</include>
                <include>NOTICE*</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/site</directory>
            <outputDirectory>docs</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

(2) 自定義Assembly Descriptor

一般來說,內置的assembly descriptor都不滿足需求,這個時候就需要寫自己的assembly descriptor的實現了。
使用 descriptors,指定打包文件 src/assembly/assembly.xml,即在配置文件內指定打包操作要使用這個自定義assembly descriptor(自定義的xml中配置),需要如下配置,即要引入描述文件:

<configuration>  
    <finalName>demo</finalName>  
    <descriptors>
        <!--描述文件路徑-->
        <descriptor>src/assembly/assembly.xml</descriptor>  
    </descriptors>  
    <outputDirectory>output</outputDirectory>
</configuration> 

示例:
src/assembly/assembly.xml:

<?xml version='1.0' encoding='UTF-8'?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0  
                    http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>demo</id>
    
    <formats>
        <format>jar</format>
    </formats>
    
    <includeBaseDirectory>false</includeBaseDirectory>
    
    <fileSets>
        <fileSet>
        
            <directory>${project.build.directory}/classes</directory>
            
            <outputDirectory>/</outputDirectory>
            
        </fileSet>
    </fileSets>
</assembly>

這個定義很簡單:

  • format:指定打包類型;
  • includeBaseDirectory:指定是否包含打包層目錄(比如finalName是output,當值爲true,所有文件被放在output目錄下,否則直接放在包的根目錄下);
  • fileSets:指定要包含的文件集,可以定義多個fileSet;
  • directory:指定要包含的目錄;
  • outputDirectory:指定當前要包含的目錄的目的地。

回到pom的配置中,自定義的configuration配置後,將會生成一個demo-demo.jar 文件在目錄 output 下,其中前一個demo來自finalName,後一個demo來自assembly descriptor中的id,其中的內容和默認的打包出來的jar類似。

如果只想有finalName,則增加配置:

<appendAssemblyId>false</appendAssemblyId>  

對於描述文件的元素,即assembly.xml中的配置節點的詳細配置,在此稍作總結,見下。

assembly.xml節點配置

在配置assembly.xml之前,我們先看一下pom中引入插件的結構。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
 ------------(1)座標-----------
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
 ------------(2)入口-----------
          <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.***.startup.BootStrap</mainClass> <!-- 你的主類名 -->
            </manifest>
          </archive>
 ------------(3)描述-----------  
          <descriptors>
            <descriptor>src/assembly/assembly.xml</descriptor>
          </descriptors>
        </configuration>
        [...]
</project>

archive說明
上面的mainClass標籤中的內容替換成自己的main函數所在的類,前面要包含package名字,也就是package_name.MainClassName

assembly.xml文件的主要結構如下。

id

<id>distribution</id>

id 標識符,添加到生成文件名稱的後綴符。如果指定 id 的話,目標文件則是 ${artifactId}-${id}.tar.gz

formats

maven-assembly-plugin 支持的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同時指定多個打包格式

<formats>
    <format>dir</format>
  </formats>

dependencySets

用來定製工程依賴 jar 包的打包方式,核心元素如下表所示。

元素 類型 作用
outputDirectory String 指定包依賴目錄,該目錄是相對於根目錄
includes List<String> 包含依賴
excludes List<String> 排除依賴
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <excludes>
                <exclude>${project.groupId}:${project.artifactId}</exclude>
            </excludes>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.groupId}:${project.artifactId}</include>
            </includes>
        </dependencySet>
    </dependencySets>

fileSets

管理一組文件的存放位置,核心元素如下表所示。

元素 類型 作用
outputDirectory String 指定文件集合的輸出目錄,該目錄是相對於根目錄
includes List<String> 包含文件
excludes List<String> 排除文件
fileMode String 指定文件屬性,使用八進制表達,分別爲(User)(Group)(Other)所屬屬性,默認爲 0644
    <fileSets>
        <fileSet>
            <directory>shell</directory>
            <outputDirectory>/shell</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>cluster_config</directory>
            <outputDirectory>/cluster_config</outputDirectory>
        </fileSet>
    </fileSets>

其他

其他的,如files節點基本類似fileSets。不常用的暫不介紹。

至此,即可按打包成功。下邊給出具體示例。

4. demo

見下一篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章