01-创建springboot项目的两种方式
本文介绍spring-boot项目创建的两种方式。
第一种方式:springboot作为parent
我们一般情况下,创建一个单个的springboot项目时,在项目的pom.xml文件里,指定当前项目的parent为spring-boot-starter-parent即可,配置如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.3</version> <relativePath/> <!-- lookup parent from repository --> </parent>
这种方式是最常用的,也是用spring starter,不管是网页版,还是IDE里的项目向导默认的方式。
但是这种方式对于多模块项目存在一个严重问题:就是所有的子模块都必须是spring boot项目。
这是非常荒谬的设计。比如一个项目结构如下:
- kkrpc-- kkrpc-core-- kkrpc-api-- kkrpc-demo
实际上只有子项目kkrpc-demo需要时springboot项目,有一个KKrpcDemoApplication作为启动类。其他项目没有,也不需要这个类。
其中kkrpc-core只需要依赖spring即可。kkrpc-api只有接口描述,不需要任何依赖。
此时,如果kkrpc作为整个项目的根节点,如果引入了springboot作为parent,那么默认下面的这三个子项目都是springboot项目。从而导致整体无法使用mvc package打包运行。
那么这种情况下怎么办呢?
一个自然而然的想法是,kkrpc不去引入springboot作为parent,而是让kkrpc-demo引入springboot。这个想法非常正确,直接可以解决上面的问题。
但是问题时:使用什么姿势来引入呢?
如果还是用parent来引入,带来的问题就是,kkrpc-demo项目的父pom不是kkrpc,而是springboot,这就某种意义上破坏了项目结构(虽然它也可以运行)。这时候怎么办呢?
好在springboot&maven提供了另外一种选项。
第二种方式:import dependencyManagement方式
拿上面的例子来说,我们可以让kkrpc-demo的parent是一个跟springboot无关的,kkrpc这个常规的pom,然后在kkrpc-demo的pom.xml中增加如下配置,从而实现本项目也是一个springboot项目的功能。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
这段配置跟parent一样,把需要的springboot依赖都加了进来。
但是这么我们会发现,IDEA里KKrpcDemoApplication是可以编译运行的。
但是当我们用mvn package是无法编译运行的。打出来的jar也不是加入了所有依赖的fat jar。
这段配置跟parent一样,把需要的springboot依赖都加了进来。
但是这么我们会发现,IDEA里KKrpcDemoApplication是可以编译运行的。
但是当我们用mvn package是无法编译运行的。打出来的jar也不是加入了所有依赖的fat jar。
问题1:无法正确打包
这是为什么呢?这是因为,import进来了依赖,但是打包编译的配置,build/plugin相关的东西没有搞进来。
所以需要添加如下配置来实现打包springboot项目。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins></build>
这样maven运行时就知道使用spring boot的插件来打包,并做repackage处理,把依赖的jar都打到fat jar里去。
问题2:无法执行单元测试
这个时候虽然可以打包了,但是我们会发现mvn package时单元测试没有执行。提示没有找到测试类。
这个又是为什么呢?这是因为,缺少了执行单元测试的plugin配置,需要手工添加单元测试插件maven-surefire-plugin,以及对应于junit5的引擎surefire-junit-platform。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.3</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit-platform</artifactId> <version>3.2.3</version> </dependency> </dependencies> </plugin>
加上了上面的配置,就可以正确运行了。
转载自:https://juejin.cn/post/7363569085441261568