Tạo, biên dịch và chạy dự án Java với Apache Maven

Điều kiện cần:

  • Đã cài đặt JDK
  • Đã cài đặt JAVA_HOME
  • Đã cài đặt Path cho JDK
  • Biết lập trình Java căn bản

Cài đặt Maven

  1. Tải tệp apache-maven-3.6.3-bin.zip hoặc tìm trong liên kết sau: https://maven.apache.org/download.cgi
  2. Giải nén tệp vừa tạo được thư mục với cấu trúc như sau:
    apache-maven-3.6.3
    |-- bin
         |-- m2.conf
         |-- mvn
         |-- mvn.cmd
         |-- mvnDebug
         |-- mvnDebug.cmd
         |-- mvnyjp
    |-- boot
    |-- conf
    |-- lib
    |-- LICENSE
    |-- NOTICE
    |-- README.txt​
  3. Cài đặt Path đến thư mục /apache-maven-3.6.3/bin
  4. Kiểm tra đã cài đặt thành công:
    Chạy ứng dụng Command Prompt/PowerShell trên Windows
    Chạy ứng dụng Terminal trên Unix/Linux/macOS
    Thực hiện lệnh sau:
    mvn --version​

Tạo Project bằng lệnh mvn

Sử dụng lệnh sau để tạo Project

mvn archetype:generate -DgroupId=dev.sinhnx.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Trong đó:

Tham số Mô tả
archetype:generate  
-DgroupId=dev.sinhnx.app tên package trong dự án
-DartifactId=my-app tên dự án (cũng là tên thư mục được tạo)
-DarchetypeArtifactId=maven-archetype-quickstart  
-DarchetypeVersion=1.4  
-DinteractiveMode=false  

Cấu trúc dự án Maven

my-app
|-- pom.xml
|-- src
    |-- main
        |-- java
            |-- dev
                |-- sinhnx
                    |-- app
                        |-- App.java
    |-- test
        |-- java
            |-- dev
                |-- sinhnx
                    |-- app
                        |-- AppTest.java

Tệp pom.xml là cấu hình dự án trong Maven. Đây là một tệp cấu hình duy nhất chứa phần lớn thông tin cần thiết để xây dựng dự án theo cách bạn muốn. POM là rất lớn và có thể gây nản lòng về sự phức tạp của nó, nhưng không cần thiết phải hiểu tất cả những điều phức tạp chỉ để sử dụng nó một cách hiệu quả. POM của dự án này là:

<?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>

  <groupId>dev.sinhnx.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</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>
  </dependencies>

  <build>
    <pluginManagement>
      <!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.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>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

Cấu hình mainClass

Mở tệp pom.xml thay đổi thẻ <plugin><artifactId>maven-jar-plugin</artifactId></plugin>:như sau:

        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
          <configuration>
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>dev.sinhnx.app.App</mainClass>
                <classpathPrefix>dependency/</classpathPrefix>
              </manifest>
            </archive>
          </configuration>
        </plugin>

Biên dịch, đóng gói dự án

  • Để biên dịch dự án sử dụng lệnh sau:
    mvn compile​
  • Để đóng gói dự án sử dụng lệnh sau:
    mvn package​

Sao chép thư viện phụ thuộc

Nếu bạn sử dụng thư viện phụ thuộc được cấu hình trong thẻ <dependencies></dependencies> (giống như thư viện junit) thì sử dụng lệnh sau để tải các thư viện vào thư mục /dependency

mvn clean dependency:copy-dependencies package

Lưu ý để thiết lập classpath đến thư mục đã sao chép thư viện thì cần cấu hình ngay sau thẻ <mainClass></mainClass> thẻ sau (như đã làm trong phần Cấu hình mainClass):

<classpathPrefix>dependency/</classpathPrefix>

Chạy ứng dụng dự án đã đóng gói

Để chạy ứng dụng đã đóng gói thực hiện lệnh sau:

java -cp target/my-app-1.0-SNAPSHOT.jar dev.sinhnx.app.App

Nếu đã cấu hình mainClass thì có thể chạy lệnh như sau:

cd ./target
java -jar my-app-1.0-SNAPSHOT.jar

Tổng kết

  • Cần cài đặt môi trường để chạy lệnh Maven trước khi tạo dự án
  • Sử dụng lệnh mvn archetype:generate -DgroupId=dev.sinhnx.app -DartifactId=my-app để tạo dự án maven
  • Tệp pom.xml là cấu hình dự án trong Maven
  • Cần cấu hình mainClass để chạy dự án từ tệp .jar
  • Sử dung lệnh mvn compile để biên dịch dự án
  • Sử dụng lệnh mvn package để đóng gói dự án vào tệp .jar
  • Sử dụng lệnh mvn clean dependency:copy-dependencies package để tải và copy các thư viện phụ thuộc vào thư mục /dependency
  • Sử dụng lệnh java -cp target/my-app-1.0-SNAPSHOT.jar dev.sinhnx.app.App để chạy dự án sau khi đóng gói dự án.