目前,在实际的项目开发过程中,手动把我们的Springboot、SpringCloud项目打包为可执行jar包的场景确实不多了,但是有时候确实有这种需求的时候,还真的一下子想不起来要怎么做,所以在这里给大家介绍一下打包的方式。

有两种打包的方式:

  1. 项目运行依赖的所有jar都解析为class,打包进项目的可执行jar中
  2. 项目的可执行jar包和项目运行依赖的jar分开,项目运行依赖的jar都放进lib文件夹中,此时需要注意的是:运行项目时,需要把可执行jar和lib放在同目录下。

本文用来举例子使用的是Springboot项目,名称为yl-nacos-provider,是在我的前面几篇文章中构建起来的。代码很简单,是Nacos服务注册与发现基本使用的Demo。如果有需要的话,请回看:Docker下的Nacos:服务注册与发现。当然,不回看之前的文章,我相信大家在阅读本文的内容时也不会有什么障碍。

简单说明一下yl-nacos-provider包含的内容:

关于这个项目的主要内容,我会在文章最后放上重点部分的截图和代码。

方式一:项目运行依赖的所有jar都解析为class,打包进项目的可执行jar中

在pom.xml文件中添加如下代码:

<plugin> <groupId>org.apache.Maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <finalName>nacos-provider-0.0.1-SNAPSHOT</finalName> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <addclasspath>true</addClasspath> <mainClass>orj.lirj.nacos.nacosprovider.NacosProviderApplication</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.Springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>

特别说明:

finalName:需要改成你项目打包后的文件名称

mainClass:需要改成你项目的启动类

添加后完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.yl.springcloudyldemo</groupId> <artifactId>spring-cloud-yl-demo</artifactId> <version>1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.yl.nacosprovider</groupId> <artifactId>yl-nacos-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>yl-nacos-provider</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.yl.springcloudyldemocommon</groupId> <artifactId>spring-cloud-yl-demo-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <finalName>yl-nacos-provider-0.0.1-SNAPSHOT</finalName> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>org.yl.nacosprovider.ylnacosprovider.YlNacosProviderApplication</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

我们可以使用命令mvn package或者使用idea里右侧自带的Maven工具进行打包。

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(1)

idea自带的Maven工具

打包后的jar在target目录下:

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(2)

我们使用java -jar yl-nacos-provider-0.0.1-SNAPSHOT.jar命令启动打包好的jar包:

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(3)

图1

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(4)

图2

由于日志比较多,一张图截图不下,所以分了两张。出现图2标红部分,说明我们的项目启动成功了。

访问一下我们的Controller接口:localhost:9101/ylnacos/provider/hello?name=测试名称

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(5)

方式二:项目的可执行jar包和项目运行依赖的jar分开,项目运行依赖的jar都放进lib文件夹中

在pom.xml文件中添加如下代码:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.yl.nacosprovider.ylnacosprovider.YlNacosProviderApplication</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin>

特别说明:

mainClass:需要改成你项目的启动类

添加后完整的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.yl.springcloudyldemo</groupId> <artifactId>spring-cloud-yl-demo</artifactId> <version>1.0-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.yl.nacosprovider</groupId> <artifactId>yl-nacos-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>yl-nacos-provider</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.yl.springcloudyldemocommon</groupId> <artifactId>spring-cloud-yl-demo-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.yl.nacosprovider.ylnacosprovider.YlNacosProviderApplication</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

我们可以使用命令mvn package或者使用idea里右侧自带的Maven工具(截图见方式一里)进行打包。

打包后的jar在target目录下:

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(6)

在这种方式下,我们会发现,在target下出现了一个lib的文件夹。

特别说明:我们的jar的运行离不开这个lib文件夹,我们必须把我们的jar和这个lib放在同一级目录下才可以。

我们使用java -jar yl-nacos-provider-0.0.1-SNAPSHOT.jar命令启动打包好的jar包。

访问一下我们的Controller接口:localhost:9101/ylnacos/provider/hello?name=测试名称222

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(7)

报错说明:

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(8)

图3

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(9)

图4

yl-nacos-provider重点代码截图

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(10)

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(11)

spring boot 自定义jar包(SpringCloud等Java项目打包为可执行jar包的两种方式)(12)

如有问题或者其它方式,欢迎大家评论区告诉我,谢谢!

,