一、背景
最近專案在做微服務的拆分,那麼我們想讓我們的容器啟動更加的輕量級,所以我們選擇放棄tomcat等容器,而是通過maven生成帶有指定依賴的可執行jar包的方式進行處理,本文我將分享如何通過maven的maven-jar-plugin打包外掛來進行生成目的可jar包。
二、原理以及實現步驟
1.原理
我們可以通過修改maven 打jar包的maven-jar-plugin外掛的配置資訊來生成我們需要的指定依賴的可執行jar包。
2.步驟:在專案的pom.xml檔案中修改預設的jar外掛
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <!--執行jar包時執行的主類,要求類全名--> <mainClass>com.hafiz.Runner</mainClass> <!-- 是否指定專案classpath下的依賴 --> <addClasspath>true</addClasspath> <!-- 指定依賴的時候宣告字首 --> <classpathPrefix>./lib/</classpathPrefix> <!--依賴是否使用帶有時間戳的唯一版本號,如:xxx-1.3.0-20121225.012733.jar--> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration> </plugin> </plugins> </build>
接著我們還要配置maven的maven-dependency-plugin外掛把當前專案的所有依賴放到target目錄下的lib資料夾下
1 <plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-dependency-plugin</artifactId> 4 <executions> 5 <execution> 6 <id>copy</id> 7 <phase>package</phase> 8 <goals> 9 <goal>copy-dependencies</goal> 10 </goals> 11 <configuration> 12 <outputDirectory>${project.build.directory}/lib</outputDirectory> 13 </configuration> 14 </execution> 15 </executions> 16 </plugin>
其中,${project.build.directory}表示預設的target資料夾。
我們通過上文的修改便完成了適用maven生成指定依賴的可執行jar包。
我們發現生成的manifest檔案中已經設定好了Main-Class以及Class-Path,如下:
如果<addClasspath>設定為false,則生成的manifest檔案中不會宣告依賴(即不會有Class-Path宣告)
3.主類
package com.hafiz; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Desc:主類 * Created by hafiz.zhang on 2018/4/07. */ public class Runner { public static void main(String[] args) { ApplicationContext context
= new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); System.out.println("context:" + context.getClass()); System.out.println("The Main Class Is Running...."); } }
4.pom.xml
<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.hafiz</groupId> <artifactId>assembly-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>assembly-demo</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.2.6.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <!--執行jar包時執行的主類,要求類全名--> <mainClass>com.hafiz.Runner</mainClass> <!-- 是否指定專案classpath下的依賴 --> <addClasspath>true</addClasspath> <!-- 指定依賴的時候宣告字首 --> <classpathPrefix>./lib/</classpathPrefix> <!--依賴是否使用帶有時間戳的唯一版本號,如:xxx-1.3.0-20121225.012733.jar--> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration> </plugin> <!--把當前專案所有的依賴打包到target目錄下的lib資料夾下--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!--已存在的Release版本不重複copy--> <overWriteReleases>false</overWriteReleases> <!--已存在的SnapShot版本不重複copy--> <overWriteSnapshots>false</overWriteSnapshots> <!--不存在或者有更新版本的依賴才copy--> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
我們現在進入生成的jar包所在的資料夾下,使用 java -jar xxx.jar來執行生成的jar包
到此我們就完成了如何使用maven的jar包生成外掛來進行生成指定依賴的可執行jar包。
程式碼Github地址:https://github.com/hafizzhang/assembly-demo.git