SpringBoot将项目打包成jar包

SpringBoot将项目打包成jar包,第1张

1.首先在pom.xml文件中导入Springboot的maven依赖

<!--将应用打包成一个可以执行的jar包-->

    <如春build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>

    </build>

2.package一下

3.package完成以后,target中野姿会生成一个渣脊耐.jar包

4.找到对应的jar包路径下, java -jar 打包后的名字 即可运行成功

当然也可以在idea工具的Terminal控制台输入命令

可以再控制台通过命令去改端口

例如:java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8888

由于SpringBoot内置了tomcat,所以将SpringBoot项目直接打成jar包,可以燃判誉直接在cmd里面运行。

一、打包

选中项目后,打开Maven Projects视图,如下图:

然后运行package,将项目重新打包。

当日志出现:

说明打包成功。

二、导出打成功的jar包。

在target目录下:

如该图的demo-0.0.1-SNAPSHOT.jar包即为打包成功后的包,一般在SpringBoot项目的target目录下。

三、在安有java环境的电脑上直接运行

在文件管理器里面先进入SpringBoot项目皮段的target文件夹下,然后在上边的目录下输入cmd回车,即可进入对应目录下。然后在cmd里输入java  -jar   ,然后把编译好的jar直接拖入cmd,然后冲兆回车即可运行。

SpringBoot 提供了 Maven 插件 spring-boot-maven-plugin,将 Spring Boot 项目打成 jar 包或者 war 包。

只需要在pom.xml文件中加入下面这个插件配置,再通过mvn clean package获取jar包即可。

打包后 通过下面的命令即可启动一个服务。

可以看到,主要有三个大目录META-INF,BOOT-INF以及org,

比较重要的是MAINIFEST.MF文件:

该文件声明了Main-Class 配置项:可以理解为jar包的启动类,这里设置为 spring-boot-loader 项目的 JarLauncher类,进行 Spring Boot 应用的启动。

还有一个Start-Class 配置项:配置的内容是我们springboot项目的主启动类。

classes文件中保存了 Java 类所编译的 .class文件以及配置文件等。

lib目录中保存了我们项目所依赖的jar包。

该文件中即springboot为我们提供的jar包启动类,亦即JarLauncher.class

当使用 java -jar filename.jar 命令启动时,会执行封装皮迅在 JAR 文件中的程序。JAR 文件需包含 manifest,其中一行格式为 Main-Class:classname,指定了一个包含 public static void main(String[] args) 方法的类,作为该程序的启动点。

对应在示例的这个项目,问题可以翻译为为什么不可以直接使用燃举此com.jsvc.jarlearn.JarlearnApplication类作为启动类?

主要是因为,Java 没有提供任何加载嵌套 jar 文件答空的标准方法(即加载本身包含在 jar 中的 jar 文件)。当需要分发一个可以从命令行运行而不需要解压缩的自包含应用程序时 , 会出现问题。

同时,我试了下,直接运行application类的话,是找不到主类的:

因为在文件目录中,JarlearnApplication实际上是在META-INF/maven/... 中的,所以会找不到。

所以,springboot以 org.springframework.boot.loader.JarLauncher 为启动类,

又自定义了 LaunchedURLClassLoader 用来加载BOOT-INF中的class文件以及BOOT-INF/lib中的嵌套jar包。

我这边通过引入 spring-boot-loader 模块来看下JarLaunch的源码:

可以看到main方法中,执行了launch方法,改方法由JarLaunch的父类Launcher提供:

launch方法主要分为三步:

基本思路就是将 org.springframework.boot.loader 包路径添加到 java.protocol.handler.pkgs 环境变量中,从而使用自定义的 URLStreamHandler 实现类 Handler处理 jar: 协议的 URL。

关于handler 可以自行百度下。

这里有两个主要方法:

也就是 getClassPathArchivesIterator 以及 createClassLoader

首先是 getClassPathArchivesIterator :

首先是isSearchCandidate,在JarLaunch中实现:

可以看出是只处理BOOT-INF/文件夹下的内容。

然后会通过 getNestedArchives 获取到嵌套的Archive,其中的 isNestedArchive 方法也由JarLaunch实现:

基本就是获取 BOOT-INF/classes/ 下的目录以及 BOOT-INF/lib/ 下的jar文件,最终通过 getNestedArchives 将其封装为对应的Archive并返回。

然后就是 createClassLoader 方法:

基本上就是通过archives获取到所有的URL,然后创建处理这些URL的ClassLoader。

主要就是通过 getMainClass 方法获取到manifest文件中配置的 Start-Class :

然后通过另一个launch方法,开始执行:

这里createMainMethodRunner创建出来的是什么呢?

最终调用的其实就是MainMethodRunner的run方法了,其实也就是通过反射调用Application的main方法了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12366352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存