一、背景
最近项目在做微服务的拆分,那么我们想让我们的容器启动更加的轻量级,所以我们选择放弃tomcat等容器,而是通过maven生成带有指定依赖的可执行jar包的方式进行处理,本文我将分享如何通过maven的maven-jar-plugin打包插件来进行生成目的可jar包。
二、原理以及实现步骤
1.原理,我们可以通过修改maven 打jar包的maven-jar-plugin插件的配置信息来生成我们需要的指定依赖的可执行jar包。
2.步骤:在项目的pom.xml文件中修改默认的jar插件
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.apache.maven.plugins</groupId> 5 <artifactId>maven-jar-plugin</artifactId> 6 <version>2.3.1</version> 7 <configuration> 8 <archive> 9 <manifest> 10 <!--运行jar包时运行的主类,要求类全名--> 11 <mainClass>com.hafiz.Runner</mainClass> 12 <!-- 是否指定项目classpath下的依赖 --> 13 <addClasspath>true</addClasspath> 14 <!-- 指定依赖的时候声明前缀 --> 15 <classpathPrefix>bin/</classpathPrefix> 16 </manifest> 17 </archive> 18 </configuration> 19 </plugin> 20 </plugins> 21 </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.主类
1 package com.hafiz; 2 3 /** 4 * Desc:主类 5 * Created by hafiz.zhang on 2017/3/12. 6 */ 7 public class Runner { 8 public static void main(String[] args) { 9 System.out.println("The Main Class Is Running...."); 10 } 11 }
4.pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.hafiz</groupId> 6 <artifactId>assembly-demo</artifactId> 7 <version>1.0-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>assembly-demo</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 <spring.version>4.2.6.RELEASE</spring.version> 16 </properties> 17 18 <dependencies> 19 <dependency> 20 <groupId>junit</groupId> 21 <artifactId>junit</artifactId> 22 <version>3.8.1</version> 23 <scope>test</scope> 24 </dependency> 25 <dependency> 26 <groupId>org.springframework</groupId> 27 <artifactId>spring-core</artifactId> 28 <version>${spring.version}</version> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework</groupId> 32 <artifactId>spring-beans</artifactId> 33 <version>${spring.version}</version> 34 </dependency> 35 <dependency> 36 <groupId>org.springframework</groupId> 37 <artifactId>spring-context</artifactId> 38 <version>${spring.version}</version> 39 </dependency> 40 <dependency> 41 <groupId>org.springframework</groupId> 42 <artifactId>spring-jdbc</artifactId> 43 <version>${spring.version}</version> 44 </dependency> 45 <dependency> 46 <groupId>org.springframework</groupId> 47 <artifactId>spring-test</artifactId> 48 <version>${spring.version}</version> 49 </dependency> 50 <dependency> 51 <groupId>org.springframework</groupId> 52 <artifactId>spring-aop</artifactId> 53 <version>${spring.version}</version> 54 </dependency> 55 </dependencies> 56 57 <build> 58 <plugins> 59 <plugin> 60 <groupId>org.apache.maven.plugins</groupId> 61 <artifactId>maven-jar-plugin</artifactId> 62 <version>2.3.1</version> 63 <configuration> 64 <archive> 65 <manifest> 66 <!--运行jar包时运行的主类,要求类全名--> 67 <mainClass>com.hafiz.Runner</mainClass> 68 <!-- 是否指定项目classpath下的依赖 --> 69 <addClasspath>true</addClasspath> 70 <!-- 指定依赖的时候声明前缀 --> 71 <classpathPrefix>bin/</classpathPrefix> 72 </manifest> 73 </archive> 74 </configuration> 75 </plugin> 76 <plugin> 77 <groupId>org.apache.maven.plugins</groupId> 78 <artifactId>maven-dependency-plugin</artifactId> 79 <executions> 80 <execution> 81 <id>copy</id> 82 <phase>package</phase> 83 <goals> 84 <goal>copy-dependencies</goal> 85 </goals> 86 <configuration> 87 <outputDirectory>${project.build.directory}/lib</outputDirectory> 88 </configuration> 89 </execution> 90 </executions> 91 </plugin> 92 </plugins> 93 </build> 94 </project>
我们现在进入生成的jar包所在的文件夹下,使用 java -jar xxx.jar来执行生成的jar包
到此我们就完成了如何使用maven的jar包生成插件来进行生成指定依赖的可执行jar包。