maven-assembly-plugin把java工程打包成為一個可執行的jar包
1、使用maven的外掛maven-assembly-plugin
pom.xml裡新增
<build>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>org.kuan.wang.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build>
執行命令:
mvn clean compile assembly:single
在target資料夾裡生成MavenTestApp-1.0-SNAPSHOT-jar-with-dependencies.jar,這個jar包便是可執行的jar了,用命令java -jar path\jarfile
便可以執行。
注意:compile必須再assembly:single之前,要不然你工程的程式碼(class檔案)就不會被打包進去。assembly:single是maven的goal。
2、通常情況下,這個goal要繫結到maven build 的phase裡,這樣它就可以自動執行。mvn package是用來打包jar包的,只是jar包是不可執行(因為不包括其他依賴)。
我們在以上的pom檔案里加<executions>,來將所有依賴也打包進去就可以執行了。
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>org.kuan.wang.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <!-- thisis used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
如此,就直接執行以下命令即可。
mvn clean package
3、另外有幾點要注意:
1. 必須要有
<archive> <manifest> <mainClass>org.kuan.wang.App</mainClass> </manifest> </archive>
否則會報錯 :no main manifest attribute, in target\MavenTestApp-1.0-SNAPSHOT-jar-with-dependencies.jar<mainClass>
是你自己工程的入口。
2. 使用mvn clean compile assembly:single
,只生成一個jar包,其名字裡有jar-with-dependencies,是可以直接執行的。
使用mvn package
生成兩個jar包,名字裡有jar-with-dependencies的jar是可執行的。
3. 如果使用<goal>assembly</goal>
會生成兩個jar包。跟使用了mvn package
一樣,無需再像命令assembly:single
一樣前面必須加compile.