openplanning

Xây dựng dự án nhiều Module với Maven

  1. Giới thiệu
  2. Mô hình ví dụ
  3. Tạo project MathLibrary
  4. Tạo project MathWebApp
  5. Tạo project MavenParent
  6. Khai báo Maven quan hệ giữa các Project
  7. Đóng gói các module

1. Giới thiệu

Tài liệu này được viết dựa trên:
  • Eclipse 4.6 (NEON)

Bạn đang xem tài liệu nâng cao về Maven. Nếu bạn mới bắt đầu với Maven. Bạn nên xem trước tài liệu hướng dẫn Maven cho người mới bắt đầu (Hello world Maven) tại:

2. Mô hình ví dụ

Đây là mô hình ví dụ minh họa trong tài liệu này.
Mục tiêu của hướng dẫn là:
  1. Module nọ sử dụng Module kia thế nào trong Maven
  2. Đóng gói đồng loạt Module khác nhau bằng Maven (đầu ra: jar, war).
MathWebApp: là một WebApp project
MathLibrary: là một Project thư viện, chứa các class tiện ích được sử dụng bởi MathWebApp.

MavenParent: là một project làm nhiệm vụ đóng gói 2 project trên, nó là một project cha, và 2 project trên coi như là 2 module con của nó. MavenParent sẽ:
  • Đóng gói MathLibary thành file jar
  • Đóng gói MathWebApp thành file war.

3. Tạo project MathLibrary

  • File/New/Other...
Đây là một Project đơn giản, chúng ta không cần phải chọn nguyên mẫu (archetype) Maven.

Check chọn:
  • Create a simple project (skip archetype selection)
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: MathLibrary
  • Packaging: jar
Các thông tin về module cha bỏ qua, chúng ta sẽ sét đặt nó sau.
Project đã được tạo ra:
Tạo mới class MathUtils:
MathUtils.java
package org.o7planning.mathutils;

public class MathUtils {

  public static int sum(int a, int b) {
      return a + b;
  }

}

4. Tạo project MathWebApp

  • File/New/Other..
Chọn nguyên mẫu (archetype) maven-archetype-webapp. Eclipse sẽ tạo ra một Project Maven có cấu trúc của một ứng dụng web.
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: MathWebApp
  • Version: 0.0.2-SNAPSHOT (Phân biệt với version của MathLibrary - Không bắt buộc)
  • Package: org.o7planning.mathwebapp
Đây là hình chụp project MathWebApp vừa được tạo ra. Bạn có thể thấy thông báo lỗi ở đâu đó trên Project, đừng lo lắng về điều đó, nguyên nhân là bạn chưa khai báo thư viện Servlet.
Eclipse tạo ra project này có thể sai cấu trúc. Bạn cần phải kiểm tra.
  • Mở file pom.xml
Thêm vào:
<dependency>
 <groupId>javax.servlet</groupId>
 <artifactId>javax.servlet-api</artifactId>
 <version>3.1.0</version>
 <scope>provided</scope>
</dependency>
Như minh họa dưới đây:
Giờ lỗi đã không còn tồn tại:
Tiếp tục khai báo maven, MathWebApp sử dụng MathLibrary:
<dependency>
   <groupId>org.o7planning</groupId>
   <artifactId>MathLibrary</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>
MathWebApp/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>
  <groupId>org.o7planning</groupId>
  <artifactId>MathWebApp</artifactId>
  <packaging>war</packaging>
  <version>0.0.2-SNAPSHOT</version>
  <name>MathWebApp Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
      </dependency>


      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
      </dependency>
     
      <dependency>
          <groupId>org.o7planning</groupId>
          <artifactId>MathLibrary</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>        
     
  </dependencies>
  <build>
      <finalName>MathWebApp</finalName>
  </build>
</project>
Sửa file index.jsp sử dụng class tiện ích MathUtils trong project MathLibrary.
index.jsp
<html>
<body>
<h2>Hello World!</h2>

<%

int a = 100;
int b = 200;

int c = org.o7planning.mathutils.MathUtils.sum(a,b);

out.println("<h2>"+ c+"</h2>");

%>

</body>
</html>

5. Tạo project MavenParent

Tạo một Java project thông thường.
  • File/New/Other..
Nhấn phải chuột vào project MavenParent vừa được tạo ra, và chuyển đổi (convert) nó thành Maven Project.
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: MavenParent
  • Version: 1.0.0-SNAPSHOT
  • Packaging: pom

6. Khai báo Maven quan hệ giữa các Project

Đây là hình mô tả ngắn gọn cách cấu hình Maven, quan hệ giữa các module (Project).
Mở file pom.xml của 2 project MathLibrary & MathWebApp thêm vào:
<parent>
   <groupId>org.o7planning</groupId>
   <artifactId>MavenParent</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <relativePath>../MavenParent/pom.xml</relativePath>
</parent>
Mở file pom.xml của MavenParent thêm vào:
<modules>
  <module>../MathLibrary</module>
  <module>../MathWebApp</module>
</modules>
MathLibrary/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.o7planning</groupId>
 <artifactId>MathLibrary</artifactId>
 <version>0.0.1-SNAPSHOT</version>


 <parent>
     <groupId>org.o7planning</groupId>
     <artifactId>MavenParent</artifactId>
     <version>1.0.0-SNAPSHOT</version>
     <relativePath>../MavenParent/pom.xml</relativePath>
 </parent>

</project>
MathWebApp/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>
  <groupId>org.o7planning</groupId>
  <artifactId>MathWebApp</artifactId>
  <packaging>war</packaging>
  <version>0.0.2-SNAPSHOT</version>
  <name>MathWebApp Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
      </dependency>


      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
      </dependency>

      <dependency>
          <groupId>org.o7planning</groupId>
          <artifactId>MathLibrary</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>

  </dependencies>

  <parent>
      <groupId>org.o7planning</groupId>
      <artifactId>MavenParent</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <relativePath>../MavenParent/pom.xml</relativePath>
  </parent>

  <build>
      <finalName>MathWebApp</finalName>
  </build>
</project>
MavenParent/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.o7planning</groupId>
  <artifactId>MavenParent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>


  <modules>
      <module>../MathLibrary</module>
      <module>../MathWebApp</module>
  </modules>

</project>

7. Đóng gói các module

Nhấn phải chuột vào project MavenParent chọn:
  • Run As/Maven install.
Kết quả: