你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

intellij idea golang plugin IDE中Jar启动和Sprintboot启动的区别

发布时间:2026-01-02

浏览次数:0

要想把这个问题聊得清楚明白,就得补充一些前提之中的条件,比如说像Fat jar啦,还有类加载机制这类的东西 。

1、Fat jar

我们于开发业务程序之际,常常要引用第三方的jar包,最终程序经开发完成后,借助打包程序,会将自己的代码与三方jar包一道打成同一个jar包,这般的jar便称作Fat jar 。

涉及的maven插件,其打包形式乃是将整个项目打包成一个Fat jar,当中把应用程序代码打包至BOOT-INF/里,把三方jar包打包到BOOT-INF/lib内,把jar包的详细信息(诸如启动入口等)放置于META-INF/.MF文件中。

 
     
         org.springframework.boot
         spring-boot-maven-plugin
         
             xxxxApplication
         
     
 

整体Fat jar如图所示:

2、jar启动入口

要是一个jar里头存在多个类,它们都具备main方法,那么以java -jar这种方式启动的话,究竟会调用哪一个main方法呢,换句话来说,也就是一个jar启动时的入口main方法是怎样去定义的呢?

两种方式:

难道说,启动的入口,是我们在应用程序里所编写的、添加了@n的main方法吗?很明显并非如此,将jar打开去查看.MF文件,其中清清楚楚地写着Main-Class:。

org..boot..

所以说,通过java -jar 启动一个项目,启动的入口是

org..boot..类里面的main方法。

3、类加载

结合方才所见到的jar内部的具体目录结构,应用程序所依赖的三方jar包全然不在该目录之下,依据已存在的类加载器的职能状况看来,这些jar均无法被成功加载至JVM之中,故而需要通过自定义类加载器来实施对这些包的加载操作,具体究竟是怎样去做的呢,依旧是那句老话,源码之下不存在秘密,打开类,呈现如图所示:

主方法极为简易,仅为一行代码,即通过新建对象并传入参数的方式,使代码得以进入该方法, (new ()).(args); 。

由代码得知,是自定义了一个er来加载应用的所有类

这样实现程序可得知这个结论:启动IDEA输出类加载intellij idea golang plugin,启动jar输出类加载器,结果清晰明了 。

4、结论

Java -Jar会呈现以FAT JAR的形式借助er去load class(这一种情况),然而在IDE里却是直接通过er来进行load(并且是另一种情况),这样一种显著的差别会致使调用(产生相应的不同)。

为了得到不一样的结果intellij idea golang plugin,原因在于,当FAT JAR启动之际,er的load所处理的urls当中,并不存在FAT JAR自身,像是abc - 0.0.1 - .jar这种,然而应用里面的。

`src/main//META-INF/`这个目录,被打包进了FAT JAR之中,具体是`abc-0.0.1-.jar!/META-INF/` 这样一来,这些内容就不会被访问到了 。

这就是为何,有些时候,在IDE里能够读取到的,在Run FAT JAR的情形下却读取不到了 。

如有侵权请联系删除!

13262879759

微信二维码