maven 多模塊項目

出處:http://www.blogjava.net/fancydeepin/archive/2015/06/27/maven-modules.html


項目結構

proj

  |

  |— proj-model

  |      |

  |      |— src

  |      |— pom (jar)

  |      |

  |

  |— proj-dao

  |      |

  |      |— src

  |      |— pom (jar)

  |      |

  |

  |— proj-service

  |      |

  |      |— src

  |      |— pom (jar)

  |      |

  |

  |— proj-web

  |      |

  |      |— src

  |      |— pom (war)

  |      |

  |

  |— pom.xml (pom)

  |


這裏的 proj 項目分了 4 個模塊,它們分別是:proj-model(數據模型層)、proj-dao(數據庫訪問層)、proj-service(業務邏輯層)、
proj-web(頁面表現層)。下面我們來依次的來創建這幾個項目(確保你的 maven 環境已經配置好,以下是 window 環境的 cmd 終端操作) 。

創建模塊項目

01.創建 proj 項目

mvn archetype:create -DgroupId=org.fanlychie -DartifactId=proj

 

02.創建 proj-model 項目

mvn archetype:create -DgroupId=org.fanlychie -DartifactId=proj-model

 

03.創建 proj-dao 項目

mvn archetype:create -DgroupId=org.fanlychie -DartifactId=proj-dao

 

04.創建 proj-service 項目

mvn archetype:create -DgroupId=org.fanlychie -DartifactId=proj-service

 

05.創建 proj-web 項目

mvn archetype:create -DgroupId=org.fanlychie -DartifactId=proj-web -DarchetypeArtifactId=maven-archetype-webapp

 

06.將 proj-model、proj-dao、proj-service、proj-web 移動到 proj 目錄裏

for /r /d %i in (proj-*) do move %i proj

 

07.刪除 proj/src 文件夾(proj 作爲父模塊,不需要 src)

rd /S /Q proj\src

 

08.爲 proj-web 創建 src/main/java 目錄

mkdir proj\proj-web\src\main\java

 

09.爲 proj-web 創建 src/test/java 目錄

mkdir proj\proj-web\src\test\java

 

10.刪除 proj-model、proj-dao、proj-service、proj-web 項目 src/main/java 的源文件(忽略錯誤)

for /r /d %i in (proj\proj-*) do rd /S /Q %i\src\main\java\org

 

11.刪除 proj-model、proj-dao、proj-service、proj-web 項目 src/test/java 的源文件(忽略錯誤)

for /r /d %i in (proj\proj-*) do rd /S /Q %i\src\test\java\org

父模塊 proj/pom.xml 配置

作爲父模塊,packaging 類型必須是 pom

<groupId>org.fanlychie</groupId>
<artifactId>proj</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

聲明子模塊 

<modules>
  <module>proj-model</module>
  <module>proj-dao</module>
  <module>proj-service</module>
  <module>proj-web</module>
</modules>

在父模塊中可以通過 dependencyManagement 對依賴的包進行統一的管理 

<properties>
  <spring.version>4.1.5.RELEASE</spring.version>
</properties>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-dao</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-model</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-service</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

配置完成之後,父模塊以及父模塊的子模塊不會引入任何的構件依賴,這只是爲了讓子模塊能夠繼承得到這些配置,這樣做的好處是,在子模塊中只
需要聲明 groupId 和 artifactId 不需要聲明 version 就能準確的獲取得到依賴的構件。這樣一來,不僅能夠使子模塊的依賴配置變得簡單,
還能使項目範圍內所有依賴的構件的版本能夠得到統一,它們可以在父模塊中統一的來管理,這樣可以避免模塊之間由於版本不一致而引發的異常。
你還可以在父模塊中通過 pluginManagement 來對依賴的插件進行統一的管理 

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.2.8.v20150217</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

proj/pom.xml 完整的配置:

<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>
  <groupId>org.fanlychie</groupId>
  <artifactId>proj</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>proj</name>
  <url>http://maven.apache.org</url>
  <properties>
    <spring.version>4.1.5.RELEASE</spring.version>
  </properties>
  <modules>
    <module>proj-model</module>
    <module>proj-dao</module>
    <module>proj-service</module>
    <module>proj-web</module>
  </modules>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.fanlychie</groupId>
        <artifactId>proj-dao</artifactId>
        <version>${project.version}</version>
      </dependency>
      <dependency>
        <groupId>org.fanlychie</groupId>
        <artifactId>proj-model</artifactId>
        <version>${project.version}</version>
      </dependency>
      <dependency>
        <groupId>org.fanlychie</groupId>
        <artifactId>proj-service</artifactId>
        <version>${project.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>9.2.8.v20150217</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

子模塊 proj-model/pom.xml 配置

作爲子模塊,需要在 pom.xml 中聲明其父模塊 

<parent>
  <groupId>org.fanlychie</groupId>
  <artifactId>proj</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>

GAV(groupId、artifactId、version)參考父模塊。
maven 默認認爲父模塊是在當前項目 pom.xml 所在的目錄的上一級目錄中,這裏的 proj 項目結構設計符合這個規則。如果你的項目結構並不是
這樣,你必須通過 <relativepath> 節點來指定你的父模塊 pom.xml 所在的路徑(默認是 <relativepath>../</relativepath>)。 

<parent>
  <groupId>org.fanlychie</groupId>
  <artifactId>proj</artifactId>
  <version>1.0-SNAPSHOT</version>
  <relativePath>../</relativePath>
</parent>

proj-model/pom.xml 完整配置: 

<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.fanlychie</groupId>
    <artifactId>proj</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>proj-model</artifactId>
  <packaging>jar</packaging>
  <name>proj-model project</name>
  <url>http://maven.apache.org</url>
</project>

groupId 和 version 會從父模塊中繼承,在子模塊中不需要再配置。

子模塊 proj-dao/pom.xml 配置

爲該模塊聲明 proj-model 的依賴,因爲該模塊需要使用 proj-model 模塊中的數據模型 

<dependencies>
  <dependency>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj-model</artifactId>
  </dependency>
</dependencies>

proj-dao/pom.xml 完整配置: 

<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.fanlychie</groupId>
    <artifactId>proj</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>proj-dao</artifactId>
  <packaging>jar</packaging>
  <name>proj-dao project</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-model</artifactId>
    </dependency>
  </dependencies>
</project>

子模塊 proj-service/pom.xml 配置

爲該模塊聲明 proj-model、proj-dao 模塊的依賴,因爲該模塊需要使用 proj-model 中的數據模型和 proj-dao 中的數據庫訪問接口 

<dependencies>
  <dependency>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj-model</artifactId>
  </dependency>
  <dependency>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj-dao</artifactId>
  </dependency>
</dependencies>

proj-service/pom.xml 完整的配置: 

<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.fanlychie</groupId>
    <artifactId>proj</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>proj-service</artifactId>
  <packaging>jar</packaging>
  <name>proj-service project</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-model</artifactId>
    </dependency>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-dao</artifactId>
    </dependency>
  </dependencies>
</project>

子模塊 proj-web/pom.xml 配置

爲該模塊聲明 proj-model、proj-service 的依賴,因爲 proj-web 需要使用 proj-model 中的數據模型和 proj-service 中的業務邏輯 

<dependencies>
  <dependency>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj-model</artifactId>
  </dependency>
  <dependency>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj-service</artifactId>
  </dependency>
</dependencies>

proj-web/pom.xml 完整的配置: 

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.fanlychie</groupId>
    <artifactId>proj</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>proj-web</artifactId>
  <packaging>war</packaging>
  <name>proj-web project</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-model</artifactId>
    </dependency>
    <dependency>
      <groupId>org.fanlychie</groupId>
      <artifactId>proj-service</artifactId>
    </dependency>
  </dependencies>
  <build>
    <finalName>proj-web</finalName>
  </build>
</project>

導入項目到 eclipse

配置完成之後,接下來可以將項目導入到 eclipse,在 eclipse 中右鍵 --> Import --> Maven --> Existing Maven Projects,將 proj
項目所在的路徑複製粘貼到 Root Directory 欄並敲回車,點擊 Finish 按鈕即可。 

導入後的項目結構 

示例源碼下載:proj.zip
示例使用 jetty 作爲 web 服務器,選中 proj-web --> 右鍵 --> Run As --> Maven build... --> Goals 欄輸入 jetty:run

記得把 Resolve Workspace artifacts 選項勾選上,否則啓動時會報錯。訪問方式:http://localhost/info

打包

選中父模塊項目 proj --> 右鍵 --> Run As --> Maven build... --> Goals 欄輸入 clean package 並執行。

[INFO] Scanning for projects...

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Build Order:

[INFO] 

[INFO] proj

[INFO] proj-model project

[INFO] proj-dao project

[INFO] proj-service project

[INFO] proj-web project

[INFO]                                                                         

[INFO] ------------------------------------------------------------------------

. . . . . .

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary:

[INFO] 

[INFO] proj ............................................... SUCCESS [  0.002 s]

[INFO] proj-model project ................................. SUCCESS [  1.100 s]

[INFO] proj-dao project ................................... SUCCESS [  0.102 s]

[INFO] proj-service project ............................... SUCCESS [  0.069 s]

[INFO] proj-web project ................................... SUCCESS [  0.552 s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

 

可以看到,maven 在 build 的時候,會根據模塊之間的依賴關係,整理出一個 build 的順序,然後再按順序來 build。
執行完 package 後,各個子模塊的 target 目錄下會輸出相應的 JAR 或 WAR 包。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章