之前开发的java程序由于依赖比较多的jar包,启动命令为” java -classpath .:lib/*.jar 主类名“,这种启动方式需要指定类路径、入口类名称,并存在jar包缺失隐患。
现在利用SpringBoot的maven打包插件,可以将依赖的jar包都整理到一个jar文件中。
一、创建maven项目
名字随便起。这里叫ConfigClient。在pom.xml文件中使用如下插件。
指定mainClass,注意这个mainClass不是当前项目的类,是我们自己写的程序的主类。
1 <plugin> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-maven-plugin</artifactId> 4 <configuration> 5 <mainClass>com.bonc.tool.Tool2</mainClass> 6 <layout>ZIP</layout> 7 </configuration> 8 <executions> 9 <execution> 10 <goals> 11 <goal>repackage</goal> 12 </goals> 13 </execution> 14 </executions> 15 </plugin>
二、打包
mvn package
三、进入到target中
1.解压jar文件
jar xf ConfigClient.jar
得到三个目录:
(1)org 应用入口类,负责加载校验jar包
(2)BOOT-INF 包含两个目录
lib classes, lib用来存放所有被依赖的jar包,classes是存放我们自己开发的程序
(3)META-INF 包含一个本文的中心文件MANIFEST.MF 在启动java程序时会首先读取这个文件,来获得主类路径。
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: ChaseForFuture Start-Class: com.bonc.tool.Tool2 # pom文件所写的mainClass,在BOOT-INF/classes/中 Spring-Boot-Classes: BOOT-INF/classes/ # 我们自己写的所有程序 Spring-Boot-Lib: BOOT-INF/lib/ # 我们的程序依赖的jar包 Spring-Boot-Version: 1.5.9.RELEASE Created-By: Apache Maven 3.2.1 Build-Jdk: 1.8.0_131 Main-Class: org.springframework.boot.loader.PropertiesLauncher # java应用程序入口类
2.移动文件
如果我们写的程序没有打包为jar文件,这里将它们放入 BOOT-INF/classes中
如果我们写的程序已经打包为jar文件,这里将jar文件以及依赖的所有jar包放入 BOOT-INF/lib中
3.不压缩式打包
jar -cvfM0 ConfigClient.jar BOOT-INF META-INF org
-c表示create即创建新文件
-v表示列出verbose详细信息
-f指定文件名字
-M不创建新的MANIFEST.MF
-0 不进行压缩,仅将文件整理到一起。
这个0必须加上,表示不压缩。因为内部jar包已经压缩了,这里再次压缩,会造成内部jar无法读取。
4.运行jar包
java -jar ConfigClient.jar
这时,一个可运行的jar包可以使用了。