plugin | function |
maven-jar-plugin | maven 默認打包插件,用來創建 project jar |
maven-shade-plugin | 用來打可執行包,executable(fat) jar |
?maven-assembly-plugin | ?支持定制化打包方式,例如 apache 項目的打包方式 |
<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 倉庫中引用依賴) |
<build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName> <filters> <filter>filters/filter1.properties</filter> </filters> ...
</build>
上述例子中:<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元素的列表,每一個都描述與項目關聯的文件是什么和在哪里;<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還需要如下屬性:使用 Maven 構建一個 JAR 文件比較容易:只要定義項目包裝為 “jar”,然后執行包裝生命周期階段即可。maven compiler plugin?但是定義一個可執行 JAR 文件卻比較麻煩。采取以下步驟可以更高效:
main
?類。(MANIFEST.MF 是包裝您的應用程序時 Maven 生成的。)您可以手工進行這些操作,或者要想更高效,您可以使用兩個 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將依賴包添加進去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
<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標簽:其主要包括: <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>
<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>
<?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>
自此,介紹完畢版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态