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】
步骤一:打开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-producerartifactId>
<groupId>com.reportgroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
report-data-producer工程的pom文件中增加report-data-producer-web子工程,如下
<modules>
<module>report-data-producer-entitymodule>
<module>report-data-producer-mappermodule>
<module>report-data-producer-servicemodule>
<module>report-data-producer-controllermodule>
<module>report-data-producer-webmodule>
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-parentartifactId>
<groupId>com.reportgroupId>
<version>0.0.1-SNAPSHOTversion>
parent>
在子工程report-data-handler中创建entity、mapper、service、controller包
打开report-parent工程的pom文件在
中添加子模块report-data-handler,如下
<modules>
<module>report-data-producermodule>
<module>report-data-handlermodule>
modules>
步骤一:右键项目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-mapper依赖report-data-producer-entity,在pom中添加依赖
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-entityartifactId>
<version>${project.version}version>
dependency>
report-data-producer-service依赖report-data-producer-mapper和report-data-producer-entity
,在pom中添加依赖
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-entityartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-mapperartifactId>
<version>${project.version}version>
dependency>
report-data-producer-controller依赖report-data-producer-service和report-data-producer-entity,在pom中添加依赖
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-entityartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-serviceartifactId>
<version>${project.version}version>
dependency>
report-data-producer-web依赖report-data-producer-controller和report-data-producer-entity
,在pom中添加依赖
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-entityartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>com.reportgroupId>
<artifactId>report-data-producer-controllerartifactId>
<version>${project.version}version>
dependency>
父pom写好了依赖,子pom就通过标签继承父pom的依赖,如下
<parent>
<artifactId>report-data-producerartifactId>
<groupId>com.reportgroupId>
<version>0.0.1-SNAPSHOTversion>
<relativePath>../pom.xmlrelativePath>
parent>
值得注意的是
标签,如果pom的层次关系就像本例中的那样只隔一层,则可以省略这个。maven同样可以找到子pom。子pom中引入
标签后,就会从父pom继承
等属性了。
比如有一个mysql的依赖
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.16version>
<scope>runtimescope>
dependency>
如果不通过继承,则需要在每个pom中加入这样的依赖,这样子pom对应的模块可以引用到这个jar包。对于版本不好控制,有了继承关系后,可以通过以下方式管理
父pom中把依赖通过
引起来,表示子pom可能会用到的jar包依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.16version>
<scope>runtimescope>
dependency>
dependencies>
dependencyManagement>
子pom如果需要引用该jar包,则直接引用即可!不需要加入
,便于统一管理。此外也可以加入仅在子pom中用到的jar包,比如:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.8version>
<optional>trueoptional>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
如果父pom中使用的是
方式,则子pom会自动使用pom中的jar包
如果父pom使用的是
<dependencyManagement>
<dependencies>....dependencies>
dependencyManagement>
则子pom不会自动使用父pom中的jar包,这时如果子pom想使用的话,就要给出groupId和artifactId,无需给出version
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.1.1version>
plugin>
plugins>
pluginManagement>
build>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
plugin>
plugins>
build>