首頁 > 軟體

springboot實現maven多模組和打包部署

2022-04-07 13:02:02

開發工具 :idea

工程結構:

父工程father

子模組 dao (用於持久化資料跟資料庫互動)

子模組 entity (實體類)

子模組 service (處理業務邏輯)

子模組 web (頁面互動接收、傳遞資料,唯一有啟動類的模組)

關係: web依賴 service、dao、entity

service依賴 dao、entity

dao依賴 entity

entity誰都不依賴,獨立的

建立多模組專案

new ------file-------project

聯網狀態下 選擇 default 直接下一步

專案結構如下

接下來,把src整個刪掉,父工程不需要,因為父工程你就當它只有一個外殼就完了

接下來建立子模組 工程上右鍵 → new → Module 選擇Spring Initaializr 下一步

重複上面操作 建立service 現在建立好了 entity 和 service
dao模組和web模組可以根據實際需求選擇引入mysql,mybatis,web這些

刪除每個子模組中沒用的檔案,.mvn、.gitignore、daoiml、mvnw、mvnw.cmd檔案只留下pom.xml

刪除除了web模組以外其它模組中的Applicatin啟動項,和resources目錄下的application.properties組態檔

以上動作操作完成以後如果你發現你的子模組變成了資料夾,沒關係,找到Maven Projects重新整理一下就好了

最終的專案結果如下

依賴關係

開啟父pom.xml修改打包方式jar為pom,注意:build內容也需要做替換,因為預設的spring-boot-maven-plugin這種方式,等到後期打包的時候他會一直提示你,你引入的依賴不存在!程式碼如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<!--指定專案的spring boot的版本-->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<!--版本號-->
	<groupId>com.mr</groupId>
	<artifactId>father</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging> <!--父類別為pom-->
	<name>father</name>
	<description>Demo project for Spring Boot</description>
<!--java 版本-->
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<!--管理模組-->
	<modules>
		<module>entity</module>
		<module>dao</module>
		<module>service</module>
		<module>web</module>
	</modules>
	<!--指定專案中的公有依賴-->
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!--指定使用maven 打包-->
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.19.1</version>
				<configuration>
					<skipTests>true</skipTests>    <!--預設關掉單元測試 -->
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

這裡有個坑需要注意,dao、service、entity這三個模組的pom.xml檔案中不需要build 內容,直接幹掉

entity 的 pom.xml 內容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.mr</groupId>
	<artifactId>entity</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>entity</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

</project>

dao 的 pom.xml 內容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.mr</groupId>
	<artifactId>dao</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>dao</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--引入entity-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>entity</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>


</project>

service 模組的 pom.xml 內容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.mr</groupId>
	<artifactId>service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>service</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!--引入dao-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>dao</artifactId>
			<version>0.0.1-SNAPSHOT</version>

		</dependency>
		<!--引入entity-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>entity</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>


</project>

web模組的 pom.xml 內容

注意build部分,因為web模組作為程式的入口啟動,所以它需要打包,並且要指定Main Class

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.mr</groupId>
	<artifactId>web</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>web</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!--引入dao-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>dao</artifactId>
			<version>0.0.1-SNAPSHOT</version>

		</dependency>
		<!--引入entity-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>entity</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

		<!--引入service-->
		<dependency>
			<groupId>com.mr</groupId>
			<artifactId>service</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

	</dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!-- 指定該Main Class為全域性的唯一入口 -->
					<mainClass>com.mr.WebApplication</mainClass>
					<layout>ZIP</layout>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>

到此為止所有的依賴全部完成!接下來就是測試!做了一個簡單的查詢
在web的專案裡application.properties組態檔裡 新增以下設定

# mybatis 設定
#使用mybatis組態檔,需要指定該檔案的檔案路徑
#指定mapper.xml檔案的路徑,如果mapper.xml與介面在一起則不需要該設定

mybatis.mapper-locations=classpath:mapper/*Mapper.xml
#掃描pojo包中的實體類並起別名
mybatis.type-aliases-package=com.mr
#紀錄檔級別改為debug可以顯示sql語句,logging.level後為存放mapper介面的包
logging.level.com.mr.mapper=debug
# 開啟駝峰命名法 mybatis.configuration.map-underscore-to-camel-case: true
mybatis.configuration.map-underscore-to-camel-case=true

#設定資料來源
#德魯伊 連線池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=ws
spring.datasource.password=1
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 必須加?號後內容 北京時間東八區
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/redis?serverTimezone=GMT%2B8

在web專案裡 pom.xml 中新增以下座標

	<!--連線池-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.10</version>
		</dependency>

		<!--引入freemarker-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>

entity 模組裡 在com.mr包下 建立實體類

public class User {
 private  Integer  userId;
    private  String   userName;
    private  String   userPass;
    @DateTimeFormat(pattern ="yyyy-MM-dd HH-mm-ss")
    private Date userDate;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPass() {
        return userPass;
    }

    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }

    public Date getUserDate() {
        return userDate;
    }

    public void setUserDate(Date userDate) {
        this.userDate = userDate;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + ''' +
                ", userPass='" + userPass + ''' +
                ", userDate=" + userDate +
                '}';
    }

    public User() {
        super();
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
    }

在dao模組下 com.mr 包下 建立介面

@Mapper  //保證被掃描到
public interface UserDao {
    List<User> queryUser();
}

然後建立 mapper.xml 檔案 與web.xml 組態檔路徑一致 按下圖操作

@Mapper  //保證被掃描到
public interface UserDao {
    List<User> queryUser();
}

在service 模組 com.mr包下建立 UserService 介面 並建立對應的實現類 UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public List<User> queryService() {
        return userDao.queryUser();
    }
}

在 web 模組下 com.mr包下建立對應的 UserController 程式碼如下

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("queryUser")
    public  String   queryUser(ModelMap map){
       List<User> list= userService.queryService();
       map.put("list",list);
       return "list";
    }
}

這裡需要建立list.ftl 頁面在web 模組下的resource-----templates建立

<#list list as user>
   ${user.userId}
   ${user.userName}
   ${(user.userDate?string("yyyy-MM-dd HH-mm-ss"))!"沒有設定時間"}  <#--!後如果為空的話 需要顯示的內容-->

</#list>

具體的freemarker 使用-----https://www.jb51.net/article/236936.htm

在web 模組的 WebApplication 啟動專案
存取queryUser 效果如下: 這裡展示的是資料庫資料

打包可執行jar

因為所有的pom.xml有已經設定好了,只需要動手執行 package打包動作就行了,第一次打包不需要clean,記住以後每次打包之前clean一下,關於為什麼打jar包,不打war包這個問題,還有其它會遇到的問題,最後說明

雙擊執行package,看到BUILD SUCCESS 就證明打包成功了 前提是你的每一個模組下的pom.xml要設定好,誰需要打包,誰不需要打包,誰依賴誰,父工程是否宣告了子模組,子模組是否宣告了父工程是誰,這些是重點!否則 會焦頭爛額

接下來去找你工程目錄,web資料夾下的target資料夾,剛才打包好的jar檔案,就放在這裡了

使用 java -jar web-0.0.1-SNAPSHOT.jar 命令來測試執行打包的可執行jar檔案

執行成功 !!!!!

到此這篇關於springboot實現maven多模組和打包部署的文章就介紹到這了,更多相關maven多模組和打包部署內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com