背景
- 一个可运行的工具始终比XXX配置更加方便
- 每次一堆tomcat版本指定,对应jar替换 各种打包 替换properties 参考 maven profile VS spring profile
- 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 等】
具体目录结构如下
