使用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工程
在這裏插入圖片描述
點【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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章