SpringBoot如何打包项目?
Posted 南瓜小米胡辣汤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot如何打包项目?相关的知识,希望对你有一定的参考价值。
我们打包SpringBoot项目一般是打包成jar包或者war包!
jar包和war包最大的区别在于jar包打出来的可直接运行,我们可以直接进行访问,因为他内前置了tomcat服务器。但是war包在打包的时候会提前移除tomcat相关组件,我们需要把打包好的war包放到tomcat服务器中运行才可以!
1. 如何打包成jar包
(1)导入相关jar包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
(2)告诉pom.xml我们要打包成jar包:
<packaging>jar</packaging>
(3)双击一般是右侧的maven中的lifecycle中的package
(4)打包完成:
(5)打包完成的文件在target目录下面:
(6)在这里我们以window系统为例,然后快速启动这个项目,一般是:java -jar 打包名.jar ,然后我们进入到这个文件夹下面:
(7)这时候摁住shift,然后右击,有一个在此处打开powerShell选项,然后我们点击它:
到此为止,我们已经就把项目启动下来了,然后可以测试一下,前端发一个请求,后端会有响应!
Tips:
其实在这里我也碰到了打包问题:
Error running : No valid Maven installation found.
解决方案:
https://blog.csdn.net/han1725692339/article/details/126189023
2. 对于项目打包成war包,我看了好几篇帖子:给大家一个指引吧,大家可以参考一下这篇打包成war的方式,如果以后有时间我在给大家更新一下吧!!
https://blog.csdn.net/yw_2022/article/details/122649955
springboot项目如何打包给其他项目引用
背景
springboot项目要怎么打包,才能被其他项目GAV引入 打成springboot的可运行jar是不行的,要用maven插件打包。
例子
springboot项目被 mvn install
打包并安装到本地maven仓库后,被另外一个springboot项目引入,引入后发现JAR包存在却无法import JAR包中的类的问题。详细情况如下
两个项目
- A(springboot)
- B(springboot)
A在mvn install 到本地仓库后,其GAV被B引入,可以看到B的库里确实引入了A,但是却无法使用A里的类。如下红色
A的JAR包,看到了BOOT-INF,其他正常可以用的JAR包是没这个目录的。springboot打包的是springboot特有格式的jar包,即可以运行的fat jar,并不是传统的maven的JAR包,怎么解决
修改A项目的pom.xml,打包插件改一下,使用maven的就行了
<plugins>
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<!-- 要排除启动类 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source> <!--指明源码用的Jdk版本-->
<target>1.8</target> <!--指明打包后的Jdk版本-->
<!-- 如果发现依然排除不了,考虑先clean再install-->
<excludes>
<exclude>
com/wyf/test/sub/AopFilterSpringinterceptorOrderingApplication.java
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
注意点
1、不要将启动类打包进去
注意!注意!注意! 要将启动类排除掉,或删掉或注释掉再打包。
如果不排除,它的@SpringBootApplication注解因包含了@ComponentScan,会导致项目B如果配置扫描jar包路径,并且扫描到这个启动类,会拉起A项目所有bean的实例化。详细的情况见下面的例子
A项目没有将springboot启动类排除并打包给B项目引入,B项目使用如下扫描规则
@ComponentScan(basePackages = "B项目扫描路径", "A项目路径",
excludeFilters = @ComponentScan.Filter(value = ClassInA.class, type = FilterType.ASSIGNABLE_TYPE))
假设 "A项目路径" 里包含了A项目里的启动类,由于这个启动类有@SpringBootApplication(包含@ComponentScan),会导致 ClassInA 这个被实例化。虽然B项目里是排除ClassInA的实例化的,但是A项目却实例化了ClassInA。最终结果就是B项目的排除没有生效。
这里涉及到两个@ComponentScan(一个在B项目,另一个是A项目由@SpringBootApplication所引入的@ComponentScan),这两个是互相独立起作用的,一个禁止一个允许,最终导致实例化了
2、排除规则不生效怎么办
这个写法不生效 先clean再install
<excludes>
<exclude>
com/wyf/test/sub/AopFilterSpringinterceptorOrderingApplication.java
</exclude>
</excludes>
以上是关于SpringBoot如何打包项目?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot:Spring Boot 如何测试打包部署