1. 程式人生 > 實用技巧 >maven-assembly-plugin把java工程打包成為一個可執行的jar包

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> <!-- this
is 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.