構建Maven多模塊項目的方法
構建Maven多模塊項目
JavaWeb開發一般都會進行分層開發,通常分為
- model,模型層
- dao,數據訪問層
- service,業務邏輯層
- web,表現層
分層後,各層職責明確,後期維護起來也會容易一些。接下來我們就是使用Maven來構建以上各層,即構建一個Maven多模塊項目,項目目錄結構如下所示。
創建父模塊
執行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
,得到一個新項目。
接下來作如下處理:
- 刪除src文件夾
- 修改demo/pom.xml文件
<packaging>
標簽在沒有指明的情況下默認是jar
,這裡將其修改為pom
,表示模塊是一個可以被繼承的模塊。
創建子模塊:model層
進入demo目錄,執行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=model -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
,在demo目錄下生成瞭model目錄,model目錄裡包含瞭src目錄和pom.xml文件。
且demo/pom.xml裡自動新增瞭以下內容,
<modules> <module>model</module> </modules>
接下來做如下處理: 修改model/pom.xml文件
- 刪除
<groupId>com.jepcc.app</groupId>
和<version>1.0-SNAPSHOT</version>
- 因為groupId和version會繼承自父模塊的groupId和version。
- 增加
<packaging>jar</packaging>
- 將打包方式設置為jar。
創建子模塊:dao模塊
在demo目錄下,執行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=dao -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
,在demo目錄下生成瞭dao目錄,dao目錄裡包含瞭src目錄和pom.xml。
且demo/pom.xml裡自動新增瞭內容,如下,
<modules> <module>model</module> <module>dao</module> </modules>
接下來做如下處理:
修改 dao/pom.xml
刪除
<groupId>com.jepcc.app</groupId>
和<version>1.0-SNAPSHOT</version>
因為groupId和version會繼承自父模塊的groupId和version。增加
<packaging>jar</packaging>
將打包方式設置為jar。增加依賴
增加對model模塊的依賴
<dependency> <groupId>com.jepcc.app</groupId> <artifactId>model</artifactId> <version>${project.version}</version> </dependency>
創建子模塊:service層
在demo目錄下,執行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=service -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
,在demo目錄下生成service目錄,service目錄裡包含src目錄和pom.xml文件。
且demo/pom.xml文件自動新增內容,如下,
<modules> <module>model</module> <module>dao</module> <module>service</module> </modules>
接下來作如下處理:
修改 service/pom.xml
刪除
<groupId>com.jepcc.app</groupId>
和<version>1.0-SNAPSHOT</version>
因為groupId和version會繼承自父模塊的groupId和version。增加
<packaging>jar</packaging>
將打包方式設置為jar。增加依賴
service 層依賴dao層和model層,但我們隻需要添加dao層,因為dao模塊中已經添加瞭對model模塊的依賴。
<dependency> <groupId>com.jepcc.app</groupId> <artifactId>dao</artifactId> <version>${project.version}</version> </dependency>
創建子模塊:web層
在demo目錄下執行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=web -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
,在demo目錄下生成web目錄,web目錄包含src目錄和pom.xml。web/src/main/webapp/WEB-INF目錄下生成瞭web.xml。
web/src/main/webapp目錄下生成瞭簡單的index.jsp,如下,
<html> <body> <h2>Hello World!</h2> </body> </html>
且demo/pom.xml自動新增內容,如下,
<modules> <module>model</module> <module>dao</module> <module>service</module> <module>web</module> </modules>
接下來作如下處理:
- 修改 web/pom.xml
- 刪除
<groupId>com.jepcc.app</groupId>
和<version>1.0-SNAPSHOT</version>
- 因為groupId和version會繼承自父模塊的groupId和version。
- 增加依賴
- service 層依賴dao層和model層,但我們隻需要添加dao層,因為dao模塊中已經添加瞭對model模塊的依賴。
<dependency> <groupId>com.jepcc.app</groupId> <artifactId>service</artifactId> <version>${project.version}</version> </dependency>
註意哈,web層的打包方式是war
!!!
編譯運行項目
web模塊添加jetty插件
經過以上過程,相關模塊全部創建完成,怎麼運行起來呢?由於最終運行的是web模塊,所以我們對該模塊添加jetty支持,方便測試運行,修改web模塊的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> <artifactId>demo</artifactId> <groupId>com.jepcc.app</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>web</artifactId> <packaging>war</packaging> <name>web Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.jepcc.app</groupId> <artifactId>service</artifactId> <version>${project.version}</version> </dependency> </dependencies> <build> <finalName>web</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- 配置Jetty插件--> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
進入demo目錄,執行命令mvn clean install
,完成模塊構建。
構建完成後,web目錄下多出瞭target目錄,裡面包含web.war
。
進入web目錄,執行命令:mvn jetty:run
,啟動jetty。
打開瀏覽器訪問網址:http://localhost:8080/web/
Maven相關特性
每個子模塊都有自己的pom.xml文件,這就意味著每個子模塊都有可以添加自己的依賴,這就可能造成一個相同的依賴每個模塊都要添加一次,而且添加的版本可能不一致,這會造成項目混亂、導致運行時的各種問題。
所以,就應該有個父模塊去統一管理所有的jar包,其他子模塊去引用父模塊就好瞭,子模塊就不需要重復去定義依賴。
父模塊的配置
父模塊有兩個特點:
- 父模塊中沒有代碼,隻有pom.xml文件,用來管理所有依賴及共同配置
- 父模塊pom.xml中的
<packaging>
標簽必須設置為pom
<groupId>com.jepcc.app</groupId> <artifactId>demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
父模塊聚合子模塊
父模塊在pom.xml中通過<modules>
和<module>
聲明需要聚合的子模塊。
<modules> <module>model</module> <module>dao</module> <module>service</module> <module>web</module> </modules>
父模塊統一管理依賴包
父模塊的pom.xml通過<dependencyManagement>
來統一管理所有jar包及其版本,這樣子模塊要引用一個依賴時,就不需要在自己的pom.xml裡顯式列出版本號。因為Maven會沿著父子層次往上走,直到找到擁有dependencyManagement
標簽的模塊,最終確定依賴包對應的版本,並完成加載。
使用<dependencyManagement>
來統一管理依賴的版本號,可以確保各個依賴的版本是一致的。
關於<dependencyManagement>
和<dependencies>
,二者有如下區別:
- 對於
<dependencyManagement>
,隻是在父模塊中聲明依賴,而不實現引入,因此子模塊需要顯式聲明所需要的依賴,否則子模塊是不會從父模塊中繼承下來的。 - 當子模塊顯式聲明依賴且沒有指定版本,子模塊會從父模塊中繼承依賴;當子模塊顯式聲明依賴且指定版本號,Maven會使用子模塊中的指定版本。
- 對於
<dependencies>
,即使子模塊中不寫依賴,子模塊依然會從父模塊中繼承所有依賴。
子模塊在pom.xml中聲明父模塊
子模塊在自己的pom.xml中通過<parent>
聲明父模塊。
<parent> <artifactId>demo</artifactId> <groupId>com.jepcc.app</groupId> <version>1.0-SNAPSHOT</version> </parent>
參考文章
使用Maven構建多模塊項目
到此這篇關於構建Maven多模塊項目的方法的文章就介紹到這瞭,更多相關Maven多模塊項目內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- IDEA搭建Maven模塊化項目的實現
- Maven繼承與聚合詳解及作用介紹
- spring-boot-maven-plugin報紅解決方案(親測有效)
- maven多模塊項目依賴管理與依賴繼承詳解
- maven如何動態統一修改版本號的方法步驟