之前开发的java程序由于依赖比较多的jar包,启动命令为” java -classpath .:lib/*.jar 主类名“,这种启动方式需要指定类路径、入口类名称,并存在jar包缺失隐患。

现在利用SpringBoot的maven打包插件,可以将依赖的jar包都整理到一个jar文件中。

一、创建maven项目

名字随便起。这里叫ConfigClient。在pom.xml文件中使用如下插件。

指定mainClass,注意这个mainClass不是当前项目的类,是我们自己写的程序的主类。

 <plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.bonc.tool.Tool2</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

SpringBoot打包插件

二、打包

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包可以使用了。

java应用的jar包多合一的更多相关文章

  1. java项目打jar包的两种情况

    链接地址:http://jingyan.baidu.com/article/6b97984d8a6ddc1ca2b0bfa0.html 本文介绍一下java项目打jar包时的两种情况各怎么操作   方 ...

  2. IntelliJ IDEA导出Java 可执行Jar包

    原文:IntelliJ IDEA导出Java 可执行Jar包 保证自己的Java代码是没有问题的,在IDEA里面是可以正常运行的,然后,按下面步骤: 打开File -> Project Stru ...

  3. eclipse生成【带有外部jar包】的java可执行jar包

    之前有写过一篇使用eclipse生成java可执行jar包,但是最近的一次使用中无论如何都不成功,当双击执行打成的jar时,弹出如下错误: could not find the main class: ...

  4. SoapUI接口测试-验签值处理-调用java的加密jar包

    转载自:https://www.jianshu.com/p/7c672426a165 一. 背景: 调用接口时有个请求参数是对请求入参按一定规则进行加密生成的验签值,每次不同参数的请求生成唯一的验签值 ...

  5. java反射查看jar包中所有的类名方法名

    不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码: import java.lang.reflect.Field; impor ...

  6. Linux上java程序的jar包启动通用脚本(稳定用过)

    Linux上java程序的jar包启动通用脚本如下: #! /bin/sh export LANG="zh_CN.GBK" SERVICE_NAME=` .sh` SCRIPT_N ...

  7. java命令启动jar包

    本人对这些命令也是一知半解,记录备用. 1. 使用java命令行执行java文件 # 设置命令窗口标题 title test1 # 开启输出 @echo on # 设置环境变量JAVA_HOME se ...

  8. 高版本 eclipse 如何安装 fatjar 插件以及使用 fatjar 将 Java 程序打成 Jar 包

    高版本 eclipse 如何安装 fatjar 插件以及使用 fatjar 将 Java 程序打成 Jar 包 Eclipse Version: Neon.3 Release (4.6.3) Welc ...

  9. Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密

    [前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...

随机推荐

  1. 玩转html

    简介 CSS 是什么? CSS是Cascading Style Sheets的简称,中文称为层叠样式表. 作用 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象 ...

  2. 简单模板view调用

    $this->display();//模板名称与当前控制器.当前操作方法的名称不一致 $this->display();//调用当前控制器对应目录指定名称的模板 $this->dis ...

  3. 对java多线程里Synchronized的思考

    Synchronized这个关键字在多线程里经常会出现,哪怕做到架构师级别了,在考虑并发分流时,也经常会用到它.在本文里,将通过一些代码实验来验证它究竟是"锁"什么. 在启动多个线 ...

  4. JavaScript练习网站收集

    在学习的过程中会发现很多知识点如果不在工作中运用或者手写带验证的话,很容易忘记.任何技能的掌握都是需要不断练习的.在此收集一些自己遇到的JavaScript练习的网站. codewars 国外的一个练 ...

  5. 中介者模式(Mediator)

    中介者模式(Mediator) 中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只 ...

  6. 蓝桥杯 密码脱落 LCS

    9. 密码脱落(后来题目说是有问题,测试用例不会有E出现) X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后 ...

  7. Js 调用 WebService 实例

    Html页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/ ...

  8. 用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

    上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode.无论采用 global mode 还是 replicated mode,副本运行在哪些节点 ...

  9. Protocol Buffer序列化对比Java序列化.

    初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...

  10. node.js之第一天

    一.http模块 //require表示引包,引包就是引用自己的一个特殊功能 var http = require("http"); //创建服务器,参数是一个回调函数,表示如果有 ...