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工程
点【Next】
packaging打包方式修改为pom,将src等没有用的文件全部删除,删除后目录如下
步骤二:分布式方式创建子工程report-data-producer,点【File】-【Project Structure】-【Modules】-【+】-【New Module】
选Maven
点【Next】,选择parent为report-parent
点【Next】,填写Module名,然后点【Finish】
创建好report-data-producer工程后,packaging打包方式修改为pom,删掉src等目录后结构如下
步骤三:接下来创建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
点【Next】,填好子工程名和位置为report-data-producer目录下,后点【Finish】
依次创建mapper、service、controller、web子工程,创建完后的目录如下
创建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】
创建完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包
打开report-parent工程的pom文件在<modules>
中添加子模块report-data-handler,如下
<modules>
<module>report-data-producer</module>
<module>report-data-handler</module>
</modules>
项目框架搭建完成,目录结构如下
3、项目框架编译及测试
步骤一:右键项目report-parent,选【Run Maven】-【clean install -DskipTests】(该功能需要装maven helper插件)
编译失败了,说report-data-producer-entity找不到main class,如下图
原因:report-data-producer-entity就是一个jar包,不是可执行的jar包,不可能会有main class,出现这个错是因为parent的pom中配置了spring-boot-maven-plugin,这个插件默认会把应用打成一个可执行的jar
解决方法:把report-parent的pom中的spring-boot-maven-plugin插件去掉,在需要打包成可执行jar的工程中加入该插件
再次编译则全部成功了,如下
步骤二:分别启动report-data-handler和report-data-producer-web,测试下web是否可以访问,如果要同时启动则需要修改端口,默认是8080,找到入口程序
report-data-handler启动入口
启动成功
在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就可以访问图片了
report-data-producer-web启动入口
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>