1. 程式人生 > >maven: 打包可執行的jar包(java application)及依賴項處理

maven: 打包可執行的jar包(java application)及依賴項處理

IDE環境中,可以直接用exec-maven-plugin外掛來執行java application,類似下面這樣:

複製程式碼
 1 <plugin>
 2     <groupId>org.codehaus.mojo</groupId>
 3     <artifactId>exec-maven-plugin</artifactId>
 4     <version>1.2.1</version>
 5     <executions>
 6         <execution>
 7             <
goals> 8 <goal>exec</goal> 9 </goals> 10 </execution> 11 </executions> 12 <configuration> 13 <executable>java</executable> 14 <arguments> 15 <argument>-classpath</argument
> 16 <classpath> 17 </classpath> 18 <argument>ctas.importer.reader.app.Program</argument> 19 </arguments> 20 </configuration> 21 </plugin>
複製程式碼

18行,改成自己的Main-Class類,然後用mvn exec:exec來執行,但是部署到生產環境中時,伺服器上通常並不具備maven環境,只能用 java -jar xxx.jar

這種方式來執行,下面是一些處理細節:

一、依賴項的處理

java application執行時需要查詢依賴的第三方jar,如果查詢classpath失敗,就會報錯,可以先用

mvn dependency:copy-dependencies -DoutputDirectory=target/lib

命令,把依賴的jar包全部匯出到target/lib這個目錄下

二、利用maven-jar-plugin修改META-INF\MANIFEST.MF 清單檔案

java application的最終jar裡,用解壓工具開啟後,可以看到META-INF目錄下,有一個重要的清單檔案 MANIFEST.MF,這裡面可以指定 Main-Classclasspath,結構如下:

複製程式碼
1 Manifest-Version: 1.0
2 Built-By: jimmy
3 Build-Jdk: 1.7.0_09
4 Class-Path: lib/DataEntity-1.0.jar ...
5 Created-By: Apache Maven 3.2.3
6 Main-Class: ctas.importer.reader.app.Program
7 Archiver-Version: Plexus Archiver
複製程式碼

其中第4行指定了classpath,也就是所依賴的jar包在什麼地方,第6行表示main函式的入口類,預設情況下mvn clean package生成的jar包裡,清單檔案上並沒有這2行,需要在pom.xml中新增外掛

複製程式碼
 1 <plugin>
 2     <groupId>org.apache.maven.plugins</groupId>
 3     <artifactId>maven-jar-plugin</artifactId>
 4     <configuration>
 5         <archive>
 6             <manifest>
 7                 <mainClass>ctas.importer.reader.app.Program</mainClass>
 8                 <addClasspath>true</addClasspath>
 9                 <classpathPrefix>lib/</classpathPrefix>
10             </manifest>
11         </archive>
12         <classesDirectory>
13         </classesDirectory>
14     </configuration>
15 </plugin>
複製程式碼

第7行指定Main-Class,第9行指定classpath的相對路徑,這樣mvn package後,清單檔案裡就會自動新增Main-Class和Class-Path這二項

ok了,部署時把jar包和lib目錄,都上傳到伺服器上 ,然後測試一下,順利的話 java -jar  xxx.jar就可以了,如果要在後臺執行,前面加 nohup