SpringBoot 打包之可运行jar


声明:本文转载自https://my.oschina.net/qixiaobo025/blog/1576668,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

  1. 一个可运行的工具始终比XXX配置更加方便
  2. 每次一堆tomcat版本指定,对应jar替换 各种打包 替换properties 参考 maven profile VS spring profile
  3. tomcat什么的下载太麻烦了

SpringBoot 的execute jar可以解决上述一堆问题

当然我们仍然可以将其导出成war 后放入 tomcat中运行

实现

在需要打包的模块加入如下plugin

<build>     <plugins>         <plugin>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-maven-plugin</artifactId>         </plugin>     </plugins> </build>

如果继承自spring-boot的pom可以指定start-class

<properties>     <start-calss>com.f6car.base.Application</start-calss> </properties>

那么当我们运行

mvn clean package

将会生成一个可运行jar

那么执行脚本就很简单 如下

 java -jar /Users/qixiaobo/Downloads/zeus/web/target/web-0.0.1-SNAPSHOT.jar

So easy!

原理

知其然不知其所以然不是本人风格~

稍微剖析一下可执行jar的原理

springboot提供的maven插件会将对应start-class作为入口【如何实现呢】

学习Java web的小伙伴应该知道WEB-INF这个目录

通常规定会将一些不直接提供给用户访问的信息放入

其实Java还规定了META-INF 目录

事实上META-INF存放了一些启动类等等 也是十分重要 [dubbo 文件夹springboot 的spring.factories]

当然还有最重要的 MANIFEST.MF 文件 之前关于Jmockit 也提到过该文件 JMockit原理剖析

我们打开SpringBoor生成的可执行jar来一探究竟

Manifest-Version: 1.0 Spring-Boot-Classes: BOOT-INF/classes/ Implementation-Title: web Implementation-Version: 0.0.1-SNAPSHOT Built-By: qixiaobo Start-Class: com.f6car.base.Application Created-By: Apache Maven 3.3.9 Implementation-URL: http://projects.spring.io/spring-boot/zeus/web/ Implementation-Vendor: Pivotal Software, Inc. Implementation-Vendor-Id: com.f6car.base Build-Jdk: 1.7.0_15 Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Version: 1.5.8.RELEASE Main-Class: org.springframework.boot.loader.JarLauncher Archiver-Version: Plexus Archiver

其中Main-Class就是我们执行jar包时运行的main class  

org.springframework.boot.loader.JarLauncher

https://github.com/spring-projects/spring-boot/blob/748e0779b6077020ff855aa387ec23b65446465f/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/JarLauncher.java

public static void main(String[] args) throws Exception {           new JarLauncher().launch(args);       } /**        * Launch the application. This method is the initial entry point that should be        * called by a subclass {@code public static void main(String[] args)} method.        * @param args the incoming arguments        * @throws Exception if the application fails to launch        */       protected void launch(String[] args) throws Exception {           JarFile.registerUrlProtocolHandler();           ClassLoader classLoader = createClassLoader(getClassPathArchives());           launch(args, getMainClass(), classLoader);       }

根据指定的一些信息创建了ClassLoader 最后运行指定类【比如 Start-Class Spring-Boot-Lib 等】

具体目录结构如下

本文发表于2017年11月21日 16:33
(c)注:本文转载自https://my.oschina.net/qixiaobo025/blog/1576668,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2207 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1