1、项目结构

report-parent【父工程,用于统一依赖版本管理】
--- report-common【子工程(普通jar工程),报表通用工具包】--- report-data-handler【子工程(web工程),用于处理报表数据并生成报表,单体工程方式,entity、mapper、service、controller这些以包的形式创建】--- report-data-producer【子工程(web工程),用于报表数据生成,分布式搭建,entity、mapper、service、controller以独立项目方式创建】 ------ report-data-producer-entity【producer实体层,保存pojo和entity实体类】
------ report-data-producer-mapper【producer数据访问层,依赖entity】
------ report-data-producer-service【producer业务服务层,依赖mapper和entity】
------ report-data-producer-controller【producer业务控制层,依赖service和entity】
------ report-data-producer-web【producer项目启动Application类、配置类、静态资源文件,依赖controller和entity】

2、项目框架搭建

步骤一:打开idea创建一个spring boot工程,这个是parent工程

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包


点【Next】

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_02


packaging打包方式修改为pom,将src等没有用的文件全部删除,删除后目录如下

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_03


步骤二:分布式方式创建子工程report-data-producer,点【File】-【Project Structure】-【Modules】-【+】-【New Module】

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_04


选Maven

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_05


点【Next】,选择parent为report-parent

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_06


点【Next】,填写Module名,然后点【Finish】

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_07


创建好report-data-producer工程后,packaging打包方式修改为pom,删掉src等目录后结构如下

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_08


步骤三:接下来创建report-data-producer的子工程mapper、entity、service、controller,web,其中mapper、entity、service、controller都是普通的jar工程,web为web工程,点【File】-【Project Structure】-【Modules】-【+】-【New Module】,parent选择为report-data-producer

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_09


点【Next】,填好子工程名和位置为report-data-producer目录下,后点【Finish】

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_10


依次创建mapper、service、controller、web子工程,创建完后的目录如下

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_11


创建web子工程为spring boot工程,创建完后修改pom的parent为report-data-producer

<parent>
		<artifactId>report-data-producer</artifactId>
		<groupId>com.report</groupId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

report-data-producer工程的pom文件中增加report-data-producer-web子工程,如下

<modules>
        <module>report-data-producer-entity</module>
        <module>report-data-producer-mapper</module>
        <module>report-data-producer-service</module>
        <module>report-data-producer-controller</module>
        <module>report-data-producer-web</module>
    </modules>

3、创建子工程report-data-handler,该工程为spring boot web工程,点【File】-【Project Structure】-【Modules】-【+】-【New Module】-【Spring Assistant】

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_12


创建完report-data-handler后,打开pom文件,修改parent为report-parent

<parent>
		<artifactId>report-parent</artifactId>
		<groupId>com.report</groupId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

在子工程report-data-handler中创建entity、mapper、service、controller包

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_13

打开report-parent工程的pom文件在<modules>中添加子模块report-data-handler,如下

<modules>
        <module>report-data-producer</module>
        <module>report-data-handler</module>
    </modules>

项目框架搭建完成,目录结构如下

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_14

3、项目框架编译及测试

步骤一:右键项目report-parent,选【Run Maven】-【clean install -DskipTests】(该功能需要装maven helper插件)

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_15


编译失败了,说report-data-producer-entity找不到main class,如下图

springboot聚合项目可以打成一个jar吗 springboot聚合工程_spring_16


原因:report-data-producer-entity就是一个jar包,不是可执行的jar包,不可能会有main class,出现这个错是因为parent的pom中配置了spring-boot-maven-plugin,这个插件默认会把应用打成一个可执行的jar

解决方法:把report-parent的pom中的spring-boot-maven-plugin插件去掉,在需要打包成可执行jar的工程中加入该插件

再次编译则全部成功了,如下

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_17


步骤二:分别启动report-data-handler和report-data-producer-web,测试下web是否可以访问,如果要同时启动则需要修改端口,默认是8080,找到入口程序report-data-handler启动入口

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_18


启动成功

springboot聚合项目可以打成一个jar吗 springboot聚合工程_jar包_19


在resources/static下放一张图片,如07.jpg,然后在application.properties中加入以下配置(spring boot 2.x后的配置,如果不这样配会无法访问静态资源)

# 项目路径,spring boot 1.x的配置是server.contextPath
server.servlet.contextPath=/report-data-handler

#以什么样的路径访问静态资源(spring boot 2.X后静态资源映射,1.x默认在static目录下)
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/templates/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

输入http://localhost:8080/report-data-handler/static/07.jpg就可以访问图片了

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_20


report-data-producer-web启动入口

springboot聚合项目可以打成一个jar吗 springboot聚合工程_maven_21

report-data-producer各子工程添加相互依赖

report-data-producer-mapper依赖report-data-producer-entity,在pom中添加依赖

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-entity</artifactId>
    <version>${project.version}</version>
</dependency>

report-data-producer-service依赖report-data-producer-mapper和report-data-producer-entity
,在pom中添加依赖

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-entity</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-mapper</artifactId>
    <version>${project.version}</version>
</dependency>

report-data-producer-controller依赖report-data-producer-service和report-data-producer-entity,在pom中添加依赖

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-entity</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-service</artifactId>
    <version>${project.version}</version>
</dependency>

report-data-producer-web依赖report-data-producer-controller和report-data-producer-entity
,在pom中添加依赖

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-entity</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.report</groupId>
    <artifactId>report-data-producer-controller</artifactId>
    <version>${project.version}</version>
</dependency>

4、父项目与子项目之间依赖引用问题

父pom写好了依赖,子pom就通过标签继承父pom的依赖,如下

<parent>
		<artifactId>report-data-producer</artifactId>
		<groupId>com.report</groupId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../pom.xml</relativePath>  <!--本例中此处是可选的-->
	</parent>

值得注意的是<relativePath>标签,如果pom的层次关系就像本例中的那样只隔一层,则可以省略这个。maven同样可以找到子pom。子pom中引入<parent>标签后,就会从父pom继承<version>等属性了。

公共依赖管理

比如有一个mysql的依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
    <scope>runtime</scope>
</dependency>

如果不通过继承,则需要在每个pom中加入这样的依赖,这样子pom对应的模块可以引用到这个jar包。对于版本不好控制,有了继承关系后,可以通过以下方式管理

父pom中把依赖通过<dependecyManagement>引起来,表示子pom可能会用到的jar包依赖

<dependencyManagement>
   <dependencies>
      <dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<version>8.0.16</version>
    		<scope>runtime</scope>
		</dependency>
   </dependencies>
</dependencyManagement>

子pom如果需要引用该jar包,则直接引用即可!不需要加入<version>,便于统一管理。此外也可以加入仅在子pom中用到的jar包,比如:

<!--当然也可以加入只在这个子模块中用到的jar包-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    <optional>true</optional>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!--此处不再需要verison了!-->
</dependency>
注意点:

如果父pom中使用的是<dependencies>....</dependencies>方式,则子pom会自动使用pom中的jar包

如果父pom使用的是

<dependencyManagement>
    <dependencies>....</dependencies>
</dependencyManagement>

则子pom不会自动使用父pom中的jar包,这时如果子pom想使用的话,就要给出groupId和artifactId,无需给出version

除了jar包依赖,插件也可以通过这样的方式进行管理
<!-- parent -->
<build>
   <pluginManagement>
      <plugins>
          <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>2.1.1</version>
          </plugin>
      </plugins>
   </pluginManagement>
</build>

<!-- child -->
<build>   
   <plugins>
      <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
      </plugin>
   </plugins>
</build>