Java运行时如何找到我的主类?

时间:2019-06-27 01:46:24

标签: java spring-boot jvm

我正在学习Spring Boot。我做了一个简单的Spring Boot项目,可以在http://localhost:8080/welcome

处输出一个hello world字符串。

我使用Maven构建我的项目,该项目将输出一个jar文件。 要启动我的spring boot应用程序,请使用以下命令

java -jar my-springboot-app.jar

我的问题是:

java如何足够智能地定位我的主类及其主要方法(例如,应用程序启动器)?

我检查了jar文件并浏览了BOOT-INF和META-INF,找不到任何线索。

spring boot框架(@SpringBootApplication)或maven是否会自动为我做魔术?

2 个答案:

答案 0 :(得分:2)

Java类在更大的上下文中执行, 您运行java -jar somejar.jar the class in question will be selected in the .jar file's manifest

@SpringBootApplication将具有组件扫描器,可启用自动配置(自动接线)

componentscan-识别软件包中的所有控制器,服务和配置类。

答案 1 :(得分:1)

在使用弹簧靴子的情况下,事情要比普通的jar复杂得多。主要是因为spring boot applicaton jar并不是真正的JAR(通过jar,我指的是具有清单和编译类的东西)。常规的JAR可以由jvm进行“识别”并进行处理,但是在Spring Boot中,也存在打包的依赖项(请查看BOOT-INF/lib),因此其JAR内的jars。如何阅读?

事实证明,Spring Boot始终具有其自己的主类,该主类确实在MANIFEST.MF中被引用,并且这是打包应用程序的真正入口点。

清单文件包含以下几行:

Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.demo.DemoApplication

Main-Class是JVM入口点。这个类由spring开发人员编写,基本上有两件事:  -建立特殊的类加载器,以处理Spring Boot应用程序的“非常规jar”性质。由于这种特殊的类加载器,因此可以处理在BOOT-INF/lib中包含“ jars”的spring boot应用程序,例如,常规的Java类加载器显然不能执行此操作。  -调用Start-Class值的主要方法。 Start-Class是Spring Boot应用程序所独有的东西,它表示包含“ main”方法的类-您编写的类和您认为是切入点的类:)但是,从Spring Boot基础结构只是一个具有“普通”主方法的类-可以通过反射调用的方法。

现在有关“谁制造清单”的问题:

这个MANIFEST.MF通常是由Spring Developers为诸如Maven或Gradle之类的构建系统提供的插件自动创建的。

例如,该插件如下所示:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

在工作期间,此插件标识您的主类(在我的示例中为com.example.demo.DemoApplication)。此类用@SpringBootApplication批注标记,并具有public static void main方法。 但是,如果您放置许多这样的类,则插件可能无法识别正确的类,因此您需要在POM.xml中配置插件属性以指定正确的类。