博客概要:Springboot多模块项目搭建 + 打包jar运行 + 打包war运行
1、创建父工程
勾选SpringWeb和lombok
如图所示
然后删除src文件夹,如图:
然后修改pom文件,添加一行打包类型
<packaging>pom</packaging>
2、创建子模块
创建3个子模块,分别为sun1、sun2、web,不勾选任何依赖。因为我们所用的依赖都在父工程的pom文件中。
创建好三个模块之后,在父工程pom.xml添加依赖
<modules> <module>sun1</module> <module>sun2</module> <module>web</module> </modules>
因为我们目前用的是Springboot多模块一个启动类,所以删除sun1和sun2的启动类,然后sun1存放实体类,因为需要使用lombok插件,所以sun1项目引入父工程pom.xml,在sun1的pom.xml中更换
<parent> <groupId>com.osc</groupId> <artifactId>father</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
然后打包加上
<packaging>jar</packaging>
因为继承父工程,所以下面的可以删掉
<properties> <java.version>1.8</java.version> </properties>
因为打包的话,除了有启动类的项目,其他的打包都要删掉,所以sun1的这个删掉
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
这个时候在sun1项目上创建entity层,这个时候就可以使用lombok插件了,因为继承了父工程
@Data @AllArgsConstructor @ToString public class UserEntity { private String name; private int age; private String address; }
然后sun2我们把它定义为service层,所以需要使用sun1的实体类,,同样我们要继承父工程,然后依赖sun1
<parent> <groupId>com.osc</groupId> <artifactId>father</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<dependency> <groupId>com.osc</groupId> <artifactId>sun1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
然后删除父工程有的配置,最后编写service
@Service public class HelloService { public UserEntity getUser(){ return new UserEntity("jiutian",23,"beijing"); } }
这个时候我们就是引用sun1的实体类
最后我们创建web层,这个不需要删除启动类,然后都依赖sun1,sun2,把他们引入到pom.xml文件中。
将
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
更换,继承父工程
<parent> <groupId>com.osc</groupId> <artifactId>father</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
然后添加sun1,sun2依赖
<dependency> <groupId>com.osc</groupId> <artifactId>sun1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.osc</groupId> <artifactId>sun2</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
最后在启动类上添加扫描,因为多个模块,web启动类运行的话默认只运行扫描自己这个模块,导致找不到其他模块,所以添加一个扫描。
@ComponentScan(basePackages = {"com.osc.sun2.service","com.osc.web.controller"})
然后web项目上创建一个controller层
@RestController public class HelloController { @Autowired HelloService helloService; @GetMapping(value = "/test") public String test(){ return helloService.getUser().toString(); } }
运行一下,测试结果:
3、jar打包
在 web项目pom.xml中更换为
<build> <!--打包之后的名字--> <finalName>demo_many</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.osc.web.WebApplication</mainClass> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> <!-- <!–可以生成不含依赖包的不可执行Jar包–> <configuration> <classifier>exec</classifier> </configuration>--> </execution> </executions> </plugin> </plugins> </build>
然后父工程pom更换如下,一定要换啊!
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <skipTests>true</skipTests> <!--默认关掉单元测试 --> </configuration> </plugin> </plugins> </build>
然后使用IDEA右侧maven,当然,这个maven一定是root的,也就是父工程下面才可以,如下:
如图:
然后jar包就此成功,然后我们去命令行启动
这个时候启动了,我们继续刚刚访问,
这个和本地测试一样,说明jar包成功。
4、war包
将web项目的pom文件
<packaging>war</packaging>
然后删掉指向类配置,剩下的如下
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins>
如图:
关掉之前启动的jar命令,用kill -9 关掉,然后启动war,如图:
接下来,继续测试,
还是之前的结果,说明无论是我们在IDEA上测试,还是通过打包jar或者war,都可以得到相同结果,这就说明我们的多模块项目单启动类配置完成了。