Maven - How to build Runnable JAR file

回顧上次紀錄的Java - Use command line to export Runnable JAR file,主要透過command line的方式使用Java jar tool來打包Runnable jar,在管理小型的專案還可以,引用到的外部library也不多,但一旦需要引用到許多的library,同時又須打包出多個jar檔,且又要做自動unit test等行為的話,光是用jar tool已經不敷使用了! 因此,還是得學習如何使用自動建構工具,在此就記錄如何使用Maven來建構一Runnable JAR!
Maven下載後自行解壓縮,設定環境變數


command line執行mvn

在這邊須注意,maven會去執行專案目錄下的pom file,在此建立之

pom.xml內定義了這個建構工具要讀的基本設定

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.zhibin.javaexample</groupId>
	<artifactId>FileTransfer</artifactId>
	<packaging>jar</packaging>
	<version>1.0</version>
	<url>https://maven.apache.org</url>
        ...
</project>
需特別定義的如下:
groupId → 組織名稱
artifactId → 輸出的JAR名稱
packaging → 包裝的型態
version → JAR名稱後接的版本號,如FileTransfer-1.0.jar

<url></url>之後接續設定dependency
        <dependencies>
            <dependency>
	    	<groupId>commons-codec</groupId>
	        <artifactId>commons-codec</artifactId>
	        <version>1.15</version>
	        <!-- <scope>system</scope>
	        <systemPath>${basedir}/lib/commons-codec-1.15.jar</systemPath> -->
	    </dependency>
        </dependencies>
目的是針對project內引用到的library做相依性設定,設定好這library的groupId、artifactId及version等資訊,當執行maven build後會先到repository尋找,沒有的話就會進行下載!
maven的repository預設位置在${user.home}/.m2/repository,可至${M2_HOME}/conf/settings.xml內進行調整
若要直接引用project內已下載的library,可多設定如下:
<scope>system</scope>
<systemPath>${basedir}/lib/commons-codec-1.15.jar</systemPath>
${basedir}指的是project根目錄

再來是設定property屬性

<properties>
   <src.dir>src</src.dir>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
properties內可自行定義tag及value,到時pom內的其他tag就可以直接設定這個變數參照其value

最後是設定build tag

<build>
   <sourceDirectory>${src.dir}</sourceDirectory>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <version>3.2.0</version>
         <executions>
	 <!-- Attach the shade into the package phase -->
	    <execution>
	       <phase>package</phase>
	       <goals>
	           <goal>shade</goal>
	       </goals>
	       <configuration>
	          <transformers>
	             <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
		        <mainClass>main.Main</mainClass>
		     </transformer>
	          </transformers>
	       </configuration>
	    </execution>
	 </executions>
      </plugin>
   </plugins>
</build>
首先指定source code的進入點,將property的變數設定在此,即在src目錄下
而build tag下可設定plugin,如搭配maven-shade-plugin目的是project在輸出JAR檔時,META-INF下的MANIFEST.MF可指定Main-Class的程式進入點

最後是執行maven build,在此利用eclipse plugin來執行
Goals的欄位設定要執行的build Lifecycle,在此設定clean package
何謂package? 官網說明如下:
  • package - take the compiled code and package it in its distributable format, such as a JAR.
執行後輸出如下:

Build Success之後在project目錄下新增target folder,classes產生編譯後的檔案,JAR檔也產生如下:
執行編譯好的JAR檔

留言