首页 > 编程语言 > 详细

springboot项目jar包通过java-jar启动原理

时间:2020-06-27 20:10:20      阅读:86      评论:0      收藏:0      [点我收藏+]

springboot项目打成的jar包一般通过 java-jar  xxx.jar命令启动,原理:

    原理:查看解压后的demo/target/demo/META-INF/MANIFEST.MF

技术分享图片

 

 

 通过java-jar的方式启动 springboot项目时,首先找到    上图 文件中的  Main-Class    jarLauncher主类,查看JarLauncher源码:

依赖:

  

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-loader -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>


执行JarLauncher.java 中 的main方法:
public static void main(String[] args) throws Exception {
(new JarLauncher()).launch(args);
}

Launcher.java 的 launch()方法:
protected void launch(String[] args) throws Exception {
if (!this.isExploded()) {
JarFile.registerUrlProtocolHandler();
}

ClassLoader classLoader = this.createClassLoader(this.getClassPathArchivesIterator());
String jarMode = System.getProperty("jarmode");
String launchClass = jarMode != null && !jarMode.isEmpty() ? "org.springframework.boot.loader.jarmode.JarModeLauncher" : this.getMainClass();
this.launch(args, launchClass, classLoader);
}

查看 getMainClass()方法:(实现类中 PropertiesLauncher)
protected String getMainClass() throws Exception {
  //加载 jar包 target目录下的 MANIFEST.MF 文件中 Start-Class配置,找到springboot的启动类
    String mainClass = this.getProperty("loader.main", "Start-Class");
if (mainClass == null) {
throw new IllegalStateException("No ‘loader.main‘ or ‘Start-Class‘ specified");
} else {
return mainClass;
}
}

继续执行Launcher.java的 launch()方法:执行run方法
protected void launch(String[] args, String launchClass, ClassLoader classLoader) throws Exception {
Thread.currentThread().setContextClassLoader(classLoader);
this.createMainMethodRunner(launchClass, args, classLoader).run();
}

run()方法:
public void run() throws Exception {
   //获取springboot项目启动类
Class<?> mainClass = Class.forName(this.mainClassName, false, Thread.currentThread().getContextClassLoader());
   //获取启动方法 main方法:
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.setAccessible(true);
  //反射运行main方法
mainMethod.invoke((Object)null, this.args);
}

以上就是springboot项目通过 java-jar启动 jar包的 原理。

























springboot项目jar包通过java-jar启动原理

原文:https://www.cnblogs.com/wl20200316/p/13199556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!