springboot项目父子多模块打包方式
作者:洋哥登陆
springboot项目父子多模块打jar包
1.项目工程架构
- Student:父工程Maven
- main:子模块,也是启动类MainApplication所在的模块,main依赖其他模块
- common、core、student等:子模块。除main模块之外,依赖部分或不依赖的其他模块
注意事项:父工程创建为Maven,启动类所在模块创建时一定要用SpringBoot项目,其他子模块创建时Maven、SpringBoot都可以。
2.各个模块pom文件配置
父工程Student
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>Student</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>Student</name> <modules> <module>main</module> <module>student</module> <module>struct</module> <module>core</module> <module>common</module> </modules> </project>
注:在父工程的pom文件中一定不能有spring-boot-maven-plugin插件,否者这个插件就将传递到每一个子模块中,打包会出错;
main启动类模块
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- parent修改为父工程信息 --> <parent> <groupId>com.example</groupId> <artifactId>Student</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.example</groupId> <artifactId>main</artifactId> <version>0.0.1-SNAPSHOT</version> <name>main</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </dependency> <!-- ************************************************************************ --> <!-- 子模块依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>core</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>student</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <finalName>main</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 指定该Main Class为全局的唯一入口 --> <mainClass>com.example.main.MainApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中--> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
注:在该子模块的pom文件中必须引入spring-boot-maven-plugin打包插件,并且要配置将所依赖的jar包全都打到这一包中,如果在其他模块中引入了spring-boot-maven-plugin将会每个模块都单独打成一个包,无法拉取到启动类所在包中;
core子模块pom文件,其他子模块类似
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- parent为父工程信息 --> <parent> <artifactId>Student</artifactId> <groupId>com.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>core</artifactId> <dependencies> <!-- dependency依赖区 --> </dependencies> </project>
3.执行生成jar包和部署过程
通过maven菜单,在父工程下package(或mvn package命令)
这里需要注意的是虽然我们是将所有的jar都搭到main这个jar中,但是我们执行clean和package却是要对父工程进行;
部署:将打好的jar包上传到服务器的任意路径上,执行 java -jar main.jar(前提需要安装jdk并配置环境变量,并且版本和项目构建的版本一致)
注意:在linux环境下(通过xshell连接)运行"java -jar xxx.jar",项目成功运行后关闭窗口或者ctrl+z,会直接关闭掉项目,所以需要通过nohup和&命令配合:“nohup java -jar xxx.jar &”,在目录下会生成nohup.out日志文件查看:"tail -f nohup.out"就可以查看项目日志了。
springboot项目父子多模块打war包
修改main启动类模块pom
<!-- 打包方式为war包 --> <packaging>war</packaging> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除嵌入式tomcat插件 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> /exclusions> </dependency> <!-- war包插件 --> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> <configuration> <!-- 把class打包jar作为附件 --> <attachClasses>true</attachClasses> </configuration> </plugin>
修改springboot启动类,启动类继承SpringBootServletInitializer,重写configure方法,让Servlet容器启动时启动Spring Boot
@SpringBootApplication @ComponentScan("com.example.**") @MapperScan("com.example.**.mapper") public class MainApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } /** * 继承SpringBootServletInitializer ,覆盖configure(),把启动类Application注册进去。 * 外部web应用服务器构建Web Application Context的时候,会把启动类添加进去 * @param builder * @return */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(MainApplication.class); } }
其他说明,当前环境及工具版本:
springboot版本2.4.5
jdk版本1.8.0
tomcat版本apache-tomcat-8.5.45
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。