maven: 打包可執行的jar包(java application)及依賴項處理
阿新 • • 發佈:2019-02-17
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-Class及classpath,結構如下:
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