構(gòu)建Maven多模塊項(xiàng)目的方法
構(gòu)建Maven多模塊項(xiàng)目
JavaWeb開發(fā)一般都會(huì)進(jìn)行分層開發(fā),通常分為
- model,模型層
- dao,數(shù)據(jù)訪問層
- service,業(yè)務(wù)邏輯層
- web,表現(xiàn)層
分層后,各層職責(zé)明確,后期維護(hù)起來也會(huì)容易一些。接下來我們就是使用Maven來構(gòu)建以上各層,即構(gòu)建一個(gè)Maven多模塊項(xiàng)目,項(xiàng)目目錄結(jié)構(gòu)如下所示。

創(chuàng)建父模塊
執(zhí)行命令:mvn -B archetype:generate -DgroupId=com.jepcc.app -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4,得到一個(gè)新項(xiàng)目。

接下來作如下處理:
- 刪除src文件夾
- 修改demo/pom.xml文件
<packaging>標(biāo)簽在沒有指明的情況下默認(rèn)是jar,這里將其修改為pom,表示模塊是一個(gè)可以被繼承的模塊。
創(chuàng)建子模塊:model層
進(jìn)入demo目錄,執(zhí)行命令: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里自動(dòng)新增了以下內(nèi)容,
<modules> <module>model</module> </modules>
接下來做如下處理: 修改model/pom.xml文件
- 刪除
<groupId>com.jepcc.app</groupId>和<version>1.0-SNAPSHOT</version> - 因?yàn)間roupId和version會(huì)繼承自父模塊的groupId和version。
- 增加
<packaging>jar</packaging> - 將打包方式設(shè)置為jar。

創(chuàng)建子模塊:dao模塊
在demo目錄下,執(zhí)行命令: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里自動(dòng)新增了內(nèi)容,如下,
<modules>
<module>model</module>
<module>dao</module>
</modules>
接下來做如下處理:
修改 dao/pom.xml
刪除
<groupId>com.jepcc.app</groupId>和<version>1.0-SNAPSHOT</version>
因?yàn)間roupId和version會(huì)繼承自父模塊的groupId和version。增加
<packaging>jar</packaging>
將打包方式設(shè)置為jar。增加依賴
增加對model模塊的依賴
<dependency>
<groupId>com.jepcc.app</groupId>
<artifactId>model</artifactId>
<version>${project.version}</version>
</dependency>

創(chuàng)建子模塊:service層
在demo目錄下,執(zhí)行命令: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文件自動(dòng)新增內(nèi)容,如下,
<modules>
<module>model</module>
<module>dao</module>
<module>service</module>
</modules>
接下來作如下處理:
修改 service/pom.xml
刪除
<groupId>com.jepcc.app</groupId>和<version>1.0-SNAPSHOT</version>
因?yàn)間roupId和version會(huì)繼承自父模塊的groupId和version。增加
<packaging>jar</packaging>
將打包方式設(shè)置為jar。增加依賴
service 層依賴dao層和model層,但我們只需要添加dao層,因?yàn)閐ao模塊中已經(jīng)添加了對model模塊的依賴。
<dependency>
<groupId>com.jepcc.app</groupId>
<artifactId>dao</artifactId>
<version>${project.version}</version>
</dependency>
創(chuàng)建子模塊:web層
在demo目錄下執(zhí)行命令: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自動(dòng)新增內(nèi)容,如下,
<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> - 因?yàn)間roupId和version會(huì)繼承自父模塊的groupId和version。
- 增加依賴
- service 層依賴dao層和model層,但我們只需要添加dao層,因?yàn)閐ao模塊中已經(jīng)添加了對model模塊的依賴。
<dependency>
<groupId>com.jepcc.app</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
注意哈,web層的打包方式是war!!!
編譯運(yùn)行項(xiàng)目
web模塊添加jetty插件
經(jīng)過以上過程,相關(guān)模塊全部創(chuàng)建完成,怎么運(yùn)行起來呢?由于最終運(yùn)行的是web模塊,所以我們對該模塊添加jetty支持,方便測試運(yùn)行,修改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>
進(jìn)入demo目錄,執(zhí)行命令mvn clean install,完成模塊構(gòu)建。

構(gòu)建完成后,web目錄下多出了target目錄,里面包含web.war。

進(jìn)入web目錄,執(zhí)行命令:mvn jetty:run,啟動(dòng)jetty。

打開瀏覽器訪問網(wǎng)址:http://localhost:8080/web/
Maven相關(guān)特性
每個(gè)子模塊都有自己的pom.xml文件,這就意味著每個(gè)子模塊都有可以添加自己的依賴,這就可能造成一個(gè)相同的依賴每個(gè)模塊都要添加一次,而且添加的版本可能不一致,這會(huì)造成項(xiàng)目混亂、導(dǎo)致運(yùn)行時(shí)的各種問題。
所以,就應(yīng)該有個(gè)父模塊去統(tǒng)一管理所有的jar包,其他子模塊去引用父模塊就好了,子模塊就不需要重復(fù)去定義依賴。
父模塊的配置
父模塊有兩個(gè)特點(diǎn):
- 父模塊中沒有代碼,只有pom.xml文件,用來管理所有依賴及共同配置
- 父模塊pom.xml中的
<packaging>標(biāo)簽必須設(shè)置為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>
父模塊統(tǒng)一管理依賴包
父模塊的pom.xml通過<dependencyManagement>來統(tǒng)一管理所有jar包及其版本,這樣子模塊要引用一個(gè)依賴時(shí),就不需要在自己的pom.xml里顯式列出版本號。因?yàn)镸aven會(huì)沿著父子層次往上走,直到找到擁有dependencyManagement標(biāo)簽的模塊,最終確定依賴包對應(yīng)的版本,并完成加載。
使用<dependencyManagement>來統(tǒng)一管理依賴的版本號,可以確保各個(gè)依賴的版本是一致的。
關(guān)于<dependencyManagement>和<dependencies>,二者有如下區(qū)別:
- 對于
<dependencyManagement>,只是在父模塊中聲明依賴,而不實(shí)現(xiàn)引入,因此子模塊需要顯式聲明所需要的依賴,否則子模塊是不會(huì)從父模塊中繼承下來的。 - 當(dāng)子模塊顯式聲明依賴且沒有指定版本,子模塊會(huì)從父模塊中繼承依賴;當(dāng)子模塊顯式聲明依賴且指定版本號,Maven會(huì)使用子模塊中的指定版本。
- 對于
<dependencies>,即使子模塊中不寫依賴,子模塊依然會(huì)從父模塊中繼承所有依賴。
子模塊在pom.xml中聲明父模塊
子模塊在自己的pom.xml中通過<parent>聲明父模塊。
<parent> <artifactId>demo</artifactId> <groupId>com.jepcc.app</groupId> <version>1.0-SNAPSHOT</version> </parent>
參考文章
到此這篇關(guān)于構(gòu)建Maven多模塊項(xiàng)目的方法的文章就介紹到這了,更多相關(guān)Maven多模塊項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Validation方法實(shí)現(xiàn)原理分析
這篇文章主要介紹了Spring Validation實(shí)現(xiàn)原理分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn)
這篇文章主要為大家介紹了SpringBoot注解@ConditionalOnClass底層源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

