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

























  • 相关阅读:
    axios跨域问题(包括开发环境和生产环境)
    vue高亮一级、二级导航
    vue配置路由时报错 Error in render: "RangeError: Maximum call stack size exceeded"
    win10使用L2TP连接失败,报远程服务器未响应错误解决办法,亲测可用!
    pywinauto教程
    Python结合Pywinauto 进行 Windows UI 自动化
    Pywinauto自动化操作PC微信提取好友微信号
    Debian9 配置kali(xfce4、Metasploit、wireshark)
    Kali开启ssh
    从域环境搭建到域渗透
  • 原文地址:https://www.cnblogs.com/wl20200316/p/13199556.html
Copyright © 2020-2023  润新知