我正在学习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是否会自动为我做魔术?
答案 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中配置插件属性以指定正确的类。