maven package命令,maven之打包插件(maven-assembly-plugin,maven-shade-plugin與maven-assemb

 2023-11-19 阅读 30 评论 0

摘要:一. 介紹 maven提供的打包插件有如下三種: pluginfunctionmaven-jar-pluginmaven 默認打包插件,用來創建 project jarmaven-shade-plugin用來打可執行包,executable(fat) jar?maven-assembly-plugin?支持定制化打包方式,例如 apache 項目的打包方

一. 介紹

maven提供的打包插件有如下三種:
plugin
function
maven-jar-plugin
maven 默認打包插件,用來創建 project jar
maven-shade-plugin
用來打可執行包,executable(fat) jar
?maven-assembly-plugin?支持定制化打包方式,例如 apache 項目的打包方式
每種打包方式都具有自己的應用場景。

二. 打包準備

1). 需要設定文件的編碼格式(如果不設定,將會以系統的默認編碼進行處理)與JDK版本版本變量,代碼如下:
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties>
2). 需要確定依賴的scope:默認的scope包括如下
scope
說明
compile
默認的范圍;如果沒有提供一個范圍,那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath 中可用,同時它們也會被打包
provided
依賴只有在當JDK 或者一個容器已提供該依賴之后才使用。例如, 如果你開發了一個web 應用,你可能在編譯 classpath 中需要可用的Servlet API 來編譯一個servlet,但是你不會想要在打包好的WAR 中包含這個Servlet API;這個Servlet API JAR 由你的應用服務器或者servlet 容器提供。已提供范圍的依賴在編譯classpath (不是運行時)可用。maven package命令、它們不是傳遞性的,也不會被打包。
?runtime?依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在運行的時候才需要JDBC驅動實現。
?test?test范圍依賴 在一般的編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用
?system?system范圍依賴與provided 類似,但是你必須顯式的提供一個對于本地系統中JAR 文件的路徑。這么做是為了允許基于本地對象編譯,而這些對象是系統類庫的一部分。maven repository,這樣的構件應該是一直可用的,Maven 也不會在倉庫中去尋找它。如果你將一個依賴范圍設置成系統范圍,你必須同時提供一個 systemPath 元素。注意該范圍是不推薦使用的(你應該一直盡量去從公共或定制的 Maven 倉庫中引用依賴)
3) maven的build:
build分為兩種:
a.? base build(既為project的子元素)
<build>  <defaultGoal>install</defaultGoal>  <directory>${basedir}/target</directory>  <finalName>${artifactId}-${version}</finalName>  <filters>  <filter>filters/filter1.properties</filter>  </filters>  ...  
</build> 
上述例子中:
defaultGoal:執行build任務時,如果沒有指定目標,將使用的默認值,上述例子猶如 mvn install.
directory:build目標文件的存放目錄,默認在${basedir}/target目錄;
finalName:build目標文件的文件名,默認情況下為${artifactId}-${version};
? ? b. 指定一個特定的resource位置。例如
<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>  <testResources>  ...  </testResources>  ...  
</build>  
1、resources:一個resource元素的列表,每一個都描述與項目關聯的文件是什么和在哪里;
2、targetPath:指定build后的resource存放的文件夾。該路徑默認是basedir。maven assembly、通常被打包在JAR中的resources的目標路徑為META-INF;
3、filtering:true/false,表示為這個resource,filter是否激活。
4、directory:定義resource所在的文件夾,默認為${basedir}/src/main/resources;
5、includes:指定作為resource的文件的匹配模式,用*作為通配符;
6、excludes:指定哪些文件被忽略,如果一個文件同時符合includes和excludes,則excludes生效;
7、testResources:定義和resource類似,但只在test時使用,默認的test resource文件夾路徑是${basedir}/src/test/resources,test resource不被部署。
c. plugins,如下代碼所示:
<build>  ...  <plugins>  <plugin>  <groupId>org.apache.maven.plugins</groupId>  <artifactId>maven-jar-plugin</artifactId>  <version>2.0</version>  <extensions>false</extensions>  <inherited>true</inherited>  <configuration>  <classifier>test</classifier>  </configuration>  <dependencies>...</dependencies>  <executions>...</executions>  </plugin>  </plugins>  
</build>  
除了groupId:artifactId:version標準坐標,plugin還需要如下屬性:
1、extensions:true/false,是否加載plugin的extensions,默認為false;
2、inherited:true/false,這個plugin是否應用到該POM的孩子POM,默認true;
3、configuration:配置該plugin期望得到的properies,如上面的例子,我們為maven-jar-plugin的Mojo設置了classifier屬性;如果你的POM有一個parent,它可以從parent的build/plugins或者pluginManagement集成plugin配置。



三.?maven-jar-plugin插件
(備注以下內容引自https://www.ibm.com/developerworks/cn/java/j-5things13/index.html)
該插件為pom默認的打包插件。

使用 Maven 構建一個 JAR 文件比較容易:只要定義項目包裝為 “jar”,然后執行包裝生命周期階段即可。maven compiler plugin?但是定義一個可執行 JAR 文件卻比較麻煩。采取以下步驟可以更高效:

  1. a. 在您定義可執行類的 JAR 的 MANIFEST.MF 文件中定義一個?main?類。(MANIFEST.MF 是包裝您的應用程序時 Maven 生成的。)
  2. b. 找到您項目依賴的所有庫。
  3. c. 在您的 MANIFEST.MF 文件中包含那些庫,便于您的應用程序找到它們。maven-jar-plugin?

您可以手工進行這些操作,或者要想更高效,您可以使用兩個 Maven 插件幫助您完成:maven-jar-plugin?和?maven-dependency-plugin

01.指定manfestFile位置:具體配置如下:

<project>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><configuration><archive><manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile></archive></configuration>...</plugin></plugins></build>...
</project>
02. 使用maven-jar-plugin 修改 MANIFEST.MF文件,具體代碼如下:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>com.mypackage.MyClass</mainClass></manifest></archive></configuration>
</plugin>

所有 Maven 插件通過一個?<configuration>?元素公布了其配置,在本例中,maven-jar-plugin?修改它的?archive?屬性,特別是存檔文件的?manifest?屬性,它控制 MANIFEST.MF 文件的內容。包括 3 個元素:

  • addClassPath:將該元素設置為?true?告知?maven-jar-plugin?添加一個?Class-Path?元素到 MANIFEST.MF 文件,以及在?Class-Path?元素中包括所有依賴項。
  • classpathPrefix:如果您計劃在同一目錄下包含有您的所有依賴項,作為您將構建的 JAR,那么您可以忽略它;否則使用?classpathPrefix?來指定所有依賴 JAR 文件的前綴。在清單 1 中,classpathPrefix?指出,相對存檔文件,所有的依賴項應該位于 “lib” 文件夾。maven dependency plugin,
  • mainClass:當用戶使用?lib?命令執行 JAR 文件時,使用該元素定義將要執行的類名。上述可以通過是用maven-dependency-plugin將依賴包添加進去
maven-dependency-plugin:
當您使用這 3 個元素配置好了 MANIFEST.MF 文件之后,下一步是將所有的依賴項復制到?lib?文件夾。為此,使用?maven-dependency-plugin。代碼如下:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>install</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions>
</plugin>
maven-dependency-plugin?有一個?copy-dependencies,目標是將您的依賴項復制到您所選擇的目錄。本例中,我將依賴項復制到?build?目錄下的?lib?目錄(project-home/target/lib)。maven build,
將您的依賴項和修改的 MANIFEST.MF 放在適當的位置后,您就可以用一個簡單的命令啟動應用程序:
java -jar jarfilename.jar

四.?maven-shade-plugin
(備注:以下內容參考:https://www.jianshu.com/p/7a0e20b30401
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://gist.github.com/yangl/830e7338faf460bc5acc0442c6f6c132)
通過 maven-shade-plugin 生成一個 uber-jar,它包含所有的依賴 jar 包。也可以使用該插件解決包沖突問題。用法如下:

<project>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.1.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><relocations><relocation><pattern>org.codehaus.plexus.util</pattern><shadedPattern>org.shaded.plexus.util</shadedPattern><excludes><exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude><exclude>org.codehaus.plexus.util.xml.pull.*</exclude></excludes></relocation></relocations></configuration></execution></executions></plugin></plugins></build>...
</project>
上面的配置將 org.codehaus.plexus.util jar 包重命名為 org.shaded.plexus.util。
第二個例子:
     <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.3.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><outputFile>../target/ddstutorial.jar</outputFile><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>XX.XXX.XXX.XXX.XXXMainclass</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformeri              implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions></plugin>
上述列子中:注意transformer標簽:主要作用為了防止classes/resource標簽出現重疊,而導致混亂,引入了transfirner標簽:其主要包括:
1. org.apache.maven.plugins.shade.resource.ManifestResourceTransformer(重復的main不被合并):
2.?org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer(例如可以避免META-INF/read.me被合并)
3.org.apache.maven.plugins.shade.resource.AppendingTransformer(例如META-INF/spring.handlers與META-INF/spring.schemas)如下代碼所示
  <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer>

五.?maven-assembly-plugin
??
將相關文件打包一起分發出去,常見的例如apache的分發包以及常用的zip等包信息。配置說明:?
  <plugin><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration><outputDirectory>D:/testfolder</outputDirectory><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs> <archive>  <manifest>  <mainClass>mainclass</mainClass>  </manifest>  </archive>            </configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
若需要將按照一定的目錄進行發布的話,需要配置對應的assembly配置信息:配置信息內容如下:
<?xml version="1.0"?>-<assembly xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"><id>bin</id>-<formats><format>zip</format></formats>-<dependencySets>-<dependencySet><useProjectArtifact>true</useProjectArtifact><outputDirectory>lib</outputDirectory></dependencySet></dependencySets>-<fileSets>-<fileSet><outputDirectory>${file.separator}</outputDirectory>-<includes><include>README.txt</include></includes></fileSet>-<fileSet><directory>src/main/resources</directory><outputDirectory>${file.separator}bin</outputDirectory>-<includes><include>start.sh</include><include>start.bat</include></includes></fileSet>-<fileSet><directory>logs</directory><outputDirectory>${file.separator}logs</outputDirectory></fileSet>-<fileSet><directory>datas</directory><outputDirectory>${file.separator}datas</outputDirectory></fileSet>-<fileSet><directory>doc</directory><outputDirectory>${file.separator}doc</outputDirectory></fileSet></fileSets></assembly>
在POM中加入如下配置:
<plugin><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration><outputDirectory>D:/testfolder</outputDirectory><descriptors><descriptor>assembly.xml</descriptor></descriptors><archive>  <manifest>  <mainClass>XXXXMainClass</mainClass>  </manifest>  </archive>            </configuration></plugin>
自此,介紹完畢

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/183970.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息