zoukankan      html  css  js  c++  java
  • springboot项目jar包通过java-jar启动原理

    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包的 原理。

























  • 相关阅读:
    android模拟器加速
    QtEmbedded鼠标驱动流程分析(上)
    QML Tutorial 1 Basic Types
    android 版本
    【转】右键菜单大揭密
    【转】设置右键显示/隐藏系统文件
    【转】自己做的登录界面五款正常尺寸+一款宽屏【手把手教You如何制作登录界面】
    【转】如何添加鼠标右键菜单里的快捷图标
    【转】鼠标右键菜单设置大全
    【技术贴】我的文档不见了,我的文档消失了,我的电脑没有我的文档的解决办法。
  • 原文地址:https://www.cnblogs.com/wl20200316/p/13199556.html
Copyright © 2011-2022 走看看