原文是我在学习Spring的过程中,在Spring的官网上看到的一个指南:BuildingJava Projects with Maven——http://spring.io/guides/gs/maven/#scratch。我也是刚接触Maven。看到这篇文章觉得非常简单,但又非常实用,尤其是对于像我这样的Maven初学者。基本上看了这篇后能大概知道Maven是个什么东西,干点什么事,并能够上手使用Maven做点小例子。所以忍不住就把它整理成中文,发出来分享一下,帮助初学者。并没有对原文完整翻译,更没有逐句翻译,只对自己觉得需要进行整理。
开始吧。
首先,你需要创建一个java工程,后续Maven将对它进行构建。为了保持关注Maven,我们将建立一个尽可能简单的工程。
建立工程的目录结构如下:
└── src在这个目录下面(hello包下),创建两个类:
└── main
└── java
└── hello
HelloWorld.java和Greeter.java。
package main.java.hello
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
package main.java.hello;public class Greeter { public String sayHello() { return "Hello world!"; }}
现在你已经创建了一个可以使用Maven构建的工程,下一步就是安装Maven。
在安装Maven之前,首先要确认你已经正确安装了JDK。运行如下的命令来检查你的Java安装:
C:\> java –version
然后,你可以从 http://maven.apache.org/download.cgi下载可用的Maven。二进制版本就行了。
一旦你下载了一个zip格式的Maven,在你的电脑上选择一个路径,然后解压。
配置相关的环境变量
打开系统属性面板(桌面上右键单击“我的电脑”→“属性”),点击高级系统设置,再点击环境变量,在系统变量中新建一个变量,变量名为M2_HOME,变量值为Maven的安装目录D:\Maven(也就是你解压的路径)。点击确定,接着在系统变量中找到一个名为Path的变量,在变量值的末尾加上%M2_HOME%\bin;,注意多个值之间需要有分号隔开,然后点击确定。至此,环境变量设置完成。
为了测试你是否已经安装好了Maven,在命令行上执行mvn –v.如果你看到类似如下的信息:
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 07:51:28-0600)
Maven home: /usr/share/maven
Java version: 1.7.0_09, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.3", arch: "x86_64", family: "mac"
恭喜你!Maven安装成功。
定义一个简单的Maven构建。
Maven安装好后,你需要创建一个Maven工程的定义。Maven工程通常使用pom.xml定义。这个文件会给出工程的名字,版本以及所需的外部库的依赖。
创建一个pom.xml。将他放在工程的根目录下。Pom.xml的内容:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
除了可选的<packaging>元素外,这可能是构建一个java工程所需的可能最简单的pom.xml了。包括工程配置的下列细节:
<modelVersion>:POM模型版本(总是4.0.0)
<groupId>:工程所需的组织或机构。通常表示为一个反域名。
<artifactId>:库件的名字(比如,它的jar或者WAR文件的名字)
<version>:构建的工程的版本
<packaging>:规范工程如何打包。默认:JAR文件为“jar”,WAR文件为”war“
到此,你已经有了一个小型,但可用的Maven工程定义。接下来就可以构建你的java代码。你可以编译你工程的代码,也可以创建一个库包(比如jar文件),还可以在本地Maven依赖仓库中安装库(jar包等)。
进入你的工程所在的路径,路径下面有你上一步创建的pom.xml文件。然后在命令行敲入如下命令:
mvn complie
之后就开始执行maven了。这命令执行的目的是编译。当完成后,你可以在target/classes路径下找到编译好的.class文件。
通常不可能想直接发布或使用.class工作,所以还可以选择打包(package):
mvn package
这个命令将编译你的java代码,执行任何测试,最后将代码打包进一个JAR文件内,这个文件将会放在target路径下。Jar文件的名字就依赖于pom.xml里面的<artifactId>和<version>.比如根据上面的pom.xml。jar文件为:gs-maven-0.1.0.jar
Maven还可以在你的本地机器上管理一个依赖库(通常为你主路径的一个.m2/repository目录)。这个依赖库能够快速的接入工程的依赖(包)。如果你想将你工程的jar文件安装到你本地仓库,你可以执行安装命令:
mvn install.
这将编译,测试和打包你工程的代码,进而将它复制到本地依赖仓库,这样能够方便其他工程引用这些依赖。
说道依赖,现在是时候谈谈Maven构建中的依赖声明了。
声明依赖
上面那个HelloWorld是一个简单的自包含例子,它不依赖于任何外部库。但是,绝大多数应用都会依赖外部库来处理常用和复杂的功能。
比如,假如除了说”helloworld“外,你希望还能打印目前的日期和时间。你可以使用Joda Time库来使得事情更有趣。
首先,改变HelloWorld.java:
<span style="font-family: 'Microsoft YaHei'; font-size: 14px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">package main.java.hello;
import org.joda.time.LocalTime;
public class HelloWorld {
public static void main(String[] args) {
LocalTime currentTime = new LocalTime();
System.out.println("The current local time is: " + currentTime);
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
<span style="font-family: 'Microsoft YaHei'; font-size: 14px; background-color: rgb(255, 255, 255);">这里使用了JodaTime的localTime类来获得和打印当前时间。</span>
如果你执行”mvncompile”构建工程,因为此时你还没有将Joda Time 声明为构建时的一个编译依赖,构建将会失败。你可以在pom.xml增加下面依赖来处理:
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
这部分XML代码声明了一个依赖。在<dependency>元素内,依赖坐标通过三个子元素定义:
<groupId>:依赖所属的组织。
<artifactId>:所需的库
<version>:所需库的版本号。
缺省情况下,所有的依赖的范围标注为编译依赖。也就是说,他们在编译时必须有效。除此之外,你也可以指定<scope>:
provided:依赖需要用来编译工程代码,但是将在运行时,通过容器(比如,java servlet API)执行代码来提供。
test:依赖用来编译和执行测试,但是不需要用来构建或执行工程运行时代码。
到此,如果你再次执行“mvncompile”或“mvn package” ,Maven能够为Maven*仓库解决Joda Time 依赖(去本地仓库可以找到Joda-time-2.2.jar)。构建将会成功。
下面是完整的pom.xml:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<!-- tag::joda[] -->
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<!-- end::joda[] -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>恭喜你阅读完本篇文章。不出意外的话,你应该掌握了使用maven构建java工程。
下面自己多啰嗦几句,但对于初学者都特别有用,耐心的看完吧。
声明依赖后,构建有时候会报从你setting.xml里面配置的镜像(mirrors,mirror)download 依赖库失败。这一般是这个镜像连不上。不妨去这个链接:http://xiaoboss.iteye.com/blog/1044606下面复制一个镜像地址到你的setting.xml里面。我试过两次,都行。
关于上面的“使用Maven构建java工程“,如果你是在某个IDE(比如eclipse)上操作的话,你的这个java工程里面的pom.xml即使增加了依赖,通过Maven构建也是不会将依赖的库(Joda-time-2.2.jar)添加到这个工程的库里面来的。除非你创建的是一个maven工程,这时候,这个工程的库(Maven Dependencies)就可以加载到这个Joda-time-2.2.jar。