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 这个档案就可以了。