Maven 是一個 Java 的工具,可以用來幫你下載 Java LibrariesJava 已經存在非常多年,網路上有很多 Java 相關的 Libraries ,如果你手動一個一個下載回來安裝,再手動輸入長長的指令去載入這些 libraries ,這個做法會浪費太多的時間,而且一般人的記憶力也沒這麼好,記不下這麼多 libraries ,所以透過 Maven 就可以輕鬆的搞定所有事情。
安裝 Maven
請到下面這個網址下載 Maven 原始檔。
我的 Linux 系統安裝 Maven 方式如下: (2015/11/16)
- wget http://ftp.mirror.tw/pub/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
- tar -zxvf apache-maven-3.3.9-bin.tar.gz
- cd apache-maven-3.3.9/
- 最後再將 apache-maven 中的 bin 資料夾,設定在環境變數中,例如我是使用 Linux 系統,所以我編輯我的個人目錄的檔案 .bash_profile,加下
PATH=$PATH:~/apache-maven-3.3.3/bin/
,再執行 source ~/.bash_profile
到了這裡就算安裝完成了 ,你可以用 terminal 輸入 mvn --version
來測試看看有沒有安裝成功,例如我輸入 mvn 就會看到 mvn 有正確執行。
- $ mvn --version
- source ~/.bash_profile && mvn --version
- Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
- Maven home: /home/puritys/apache-maven-3.3.3
- Java version: 1.7.0_85, vendor: Oracle Corporation
- Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.85-2.6.1.2.el7_1.x86_64/jre
- Default locale: en_US, platform encoding: UTF-8
- OS name: "linux", version: "3.10.0-229.el7.x86_64", arch: "amd64", family: "unix"
環境變數設定
安裝 Maven 完成後,還要記得補一個環境變數叫 "M2" ,這個變數很重要,一定要設定,習慣上會直接設定成個人目錄下的 .m2,設定好之後,未來只要你用 Maven 安裝 Java Libraries , Maven 就會自動裝到 ~/.m2 這個目錄裡面 。
- export M2=~/.m2
建立一個 Maven Project
mvn archetype:generate -DgroupId=com.example -DartifactId=example -DinteractiveMode=false
執行上面這個指令, Maven 就會自動建立出 example 這個檔案夾,並且建立 pom.xml, src, main, test, App.java 這些目錄與檔案,你要開發的 source code 是放在 src/main 底下,而測試程式很明顯的要放在 test 底下。
src/main/java/example/App.java 這個程式是 Maven 自動建立的,現在我們來使用 Maven 編譯並執行這支程式。
- mvn compile
- mvn exec:java -Dexec.mainClass="com.example.App"
compile 為編譯程式,Maven 會自動裝 src/main 底下的程式所以拿出來編譯,然後放在 target 這個目錄底下,而 mvn exec:java -Dexec.mainClass="com.example.App"
這個指令則是告訴 Maven 我們要執行的程式叫 "com.example.App" ,這是 App.java 這個檔案的 Package Name ,在 Java 的世界裡每支程式都有自已的 package 名稱,package 名稱要跟符合檔案的路徑,而且最後一個點後面的名稱一定要跟檔名一樣,所以 com.example.App 會指向 com/example/App.java 這個檔案。
Unit test
在 test/java/com/example/ 底下有一個 AppTest.java 的程式,這也是 Maven 預設幫我們建立好的 Unit test 範例,我們可以使用指令 mvn test
來直接執行測試程式。
- mvn test
Maven project setting pom.xml
pom.xml 是 Maven 專用的 project 設定檔,你可以在這個檔名加上你需要的 Libraries, Maven 就能夠自動下載你指定的 Libraries ,例如預設 Maven 已經幫我們在 pom.xml 中加入了 junit 這個 unit test 的 Library 。
我安裝的 Maven 是 3.3.3 版,它預設幫我們建的 junit 版本會是 3.8 版,這個版本太舊了,某些功能無法使用,請記得手動直接升上 4.12 。
- <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>com.example</groupId>
- <artifactId>maven</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- <name>maven</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
載入 local 端 maven package
有時候我們要在 A project 找另一個 library B 的 bug ,但預設 Maven 只會去下載遠端的 library ,其實只要加入 systemPath 跟 scope 這兩個參數就行了。
- <dependencies>
- <dependency>
- <groupId>javax.sql</groupId>
- <artifactId>jdbc-stdext</artifactId>
- <version>2.0</version>
- <scope>system</scope>
- <systemPath>${java.home}/lib/rt.jar</systemPath>
- </dependency>
- </dependencies>
先到 Library B 執行 mvn package ,目錄 target 就會出現 ***.jar 的檔案,然後再回到 A 專案,修改 pom.xml 在 dependency 加入 B 的設定,並指定 system Path 就行了。
問題處理
mvn Error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher
我第一次安裝的時候有碰到這個問題,原因是因為我下載到 apache-maven-3.3.3-src.tar.gz 這個檔案,只要重新下載 apache-maven-3.x.x.bin.tar.gz 這個檔案就可以了。