springboot项⽬jar包通过java-jar启动原理
springboot项⽬打成的jar包⼀般通过 java-jar xxx.jar命令启动,原理:
原理:查看解压后的demo/target/demo/META-INF/MANIFEST.MF
通过java-jar的⽅式启动 springboot项⽬时,⾸先到上图⽂件中的 Main-Class jarLauncher主类,查看JarLauncher源码:
依赖:
<!-- mvnrepository/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()) {
}
ClassLoader classLoader = ClassPathArchivesIterator());
String jarMode = Property("jarmode");
String launchClass = jarMode != null && !jarMode.isEmpty() ? "org.springframework.boot.loader.jarmode.JarModeLauncher" : MainClass(); this.launch(args, launchClass, classLoader);}查看protected String getMainClass() throws Exception {
//加载 jar包 target⽬录下的 MANIFEST.MF ⽂件中 Start-Class配置,到springboot的启动类
String mainClass = Property("loader.main", "Start-Class"); if (mainClass == null) { throw new IllegalStateException("No 'loader.main' or 'Start-Class' specified"); } else { return mainC protected void launch(String[] args, String launchClass, ClassLoader classLoader) throws Exception {
Thread.currentThread().setContextClassLoader(classLoader);
spring怎么读取jar文件}
run()⽅法:
public void run() throws Exception {
//获取springboot项⽬启动类
Class<?> mainClass = Class.forName(this.mainClassName, false, Thread.currentThread().getContextClassLoader());
//获取启动⽅法 main⽅法:
Method mainMethod = DeclaredMethod("main", String[].class);
mainMethod.setAccessible(true);
//反射运⾏main⽅法
mainMethod.invoke((Object)null, this.args);
}
以上就是springboot项⽬通过 java-jar启动 jar包的原理。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论