springboot项目父子多模块打包方式

 更新时间:2024年01月02日 09:02:30   作者:洋哥登陆  
这篇文章主要介绍了springboot项目父子多模块打包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

springboot项目父子多模块打jar包

1.项目工程架构

  • Student:父工程Maven
  • main:子模块,也是启动类MainApplication所在的模块,main依赖其他模块
  • commoncorestudent等:子模块。除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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用spring-task定时任务动态配置修改执行时间

    使用spring-task定时任务动态配置修改执行时间

    这篇文章主要介绍了使用spring-task定时任务动态配置修改执行时间,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 一文带你了解Java中的函数式编程

    一文带你了解Java中的函数式编程

    函数式编程的理论基础是阿隆佐·丘奇(Alonzo Church)于 1930 年代提出的 λ 演算(Lambda Calculus)。这篇文章主要为大家介绍了函数式编程的相关知识,希望对大家有所帮助
    2023-04-04
  • Java编程实现的二维数组转置功能示例

    Java编程实现的二维数组转置功能示例

    这篇文章主要介绍了Java编程实现的二维数组转置功能,结合实例形式分析了Java二维数组的遍历、运算、赋值等实现转置的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 详解Spring DI依赖注入的方式和类型

    详解Spring DI依赖注入的方式和类型

    这篇文章主要介绍了详解Spring DI依赖注入的方式和类型,DI是由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台,需要的朋友可以参考下
    2023-05-05
  • SpringBoot整合Druid、Redis的示例详解

    SpringBoot整合Druid、Redis的示例详解

    Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。这篇文章主要介绍了SpringBoot整合Druid、Redis的实例详解,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • SpringBoot超详细讲解自动配置原理

    SpringBoot超详细讲解自动配置原理

    在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制,只有把这些都搞清楚了,我们在之后使用才会更加得心应手
    2022-06-06
  • 详解Java List中五种常见实现类的使用

    详解Java List中五种常见实现类的使用

    Java中提供了非常多的使用的List实现类,本文将重点介绍一下常见的五种实现类以及他们的应用场景,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Spring中@Scheduled注解的参数详解

    Spring中@Scheduled注解的参数详解

    这篇文章主要介绍了Spring中@Scheduled注解的参数详解,@Scheduled注解的使用这里不详细说明,@Scheduled注解有几个参数需要说明一下,直接对8个参数进行讲解,需要的朋友可以参考下
    2023-11-11
  • Spring @Conditional注解原理解析

    Spring @Conditional注解原理解析

    这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中IO流的BufferedOutputStream和FileOutputStream对比

    Java中IO流的BufferedOutputStream和FileOutputStream对比

    这篇文章主要介绍了Java中IO流的BufferedOutputStream和FileOutputStream对比,不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以在读写的字节比较少的情况下,效率比较低,需要的朋友可以参考下
    2023-07-07

最新评论