使用Maven搭建spring boot聚合工程

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工程
使用Maven搭建spring boot聚合工程_第1张图片
点【Next】
使用Maven搭建spring boot聚合工程_第2张图片
packaging打包方式修改为pom,将src等没有用的文件全部删除,删除后目录如下
使用Maven搭建spring boot聚合工程_第3张图片
步骤二:分布式方式创建子工程report-data-producer,点【File】-【Project Structure】-【Modules】-【+】-【New Module】
使用Maven搭建spring boot聚合工程_第4张图片
选Maven
使用Maven搭建spring boot聚合工程_第5张图片
点【Next】,选择parent为report-parent
使用Maven搭建spring boot聚合工程_第6张图片
点【Next】,填写Module名,然后点【Finish】
使用Maven搭建spring boot聚合工程_第7张图片
创建好report-data-producer工程后,packaging打包方式修改为pom,删掉src等目录后结构如下
使用Maven搭建spring boot聚合工程_第8张图片
步骤三:接下来创建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
使用Maven搭建spring boot聚合工程_第9张图片
点【Next】,填好子工程名和位置为report-data-producer目录下,后点【Finish】
使用Maven搭建spring boot聚合工程_第10张图片
依次创建mapper、service、controller、web子工程,创建完后的目录如下
使用Maven搭建spring boot聚合工程_第11张图片
创建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】
使用Maven搭建spring boot聚合工程_第12张图片
创建完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包
使用Maven搭建spring boot聚合工程_第13张图片

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

    <modules>
        <module>report-data-producermodule>
        <module>report-data-handlermodule>
    modules>

项目框架搭建完成,目录结构如下
使用Maven搭建spring boot聚合工程_第14张图片

3、项目框架编译及测试

步骤一:右键项目report-parent,选【Run Maven】-【clean install -DskipTests】(该功能需要装maven helper插件)
使用Maven搭建spring boot聚合工程_第15张图片
编译失败了,说report-data-producer-entity找不到main class,如下图
使用Maven搭建spring boot聚合工程_第16张图片
原因:report-data-producer-entity就是一个jar包,不是可执行的jar包,不可能会有main class,出现这个错是因为parent的pom中配置了spring-boot-maven-plugin,这个插件默认会把应用打成一个可执行的jar

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

再次编译则全部成功了,如下
使用Maven搭建spring boot聚合工程_第17张图片
步骤二:分别启动report-data-handler和report-data-producer-web,测试下web是否可以访问,如果要同时启动则需要修改端口,默认是8080,找到入口程序

report-data-handler启动入口
使用Maven搭建spring boot聚合工程_第18张图片
启动成功
使用Maven搭建spring boot聚合工程_第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就可以访问图片了
使用Maven搭建spring boot聚合工程_第20张图片
report-data-producer-web启动入口
使用Maven搭建spring boot聚合工程_第21张图片

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

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>

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

父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

除了jar包依赖,插件也可以通过这样的方式进行管理

<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>

你可能感兴趣的:(maven)