使用Maven构建一个简单的java工程

来源:互联网 发布:知乎机构号 编辑:程序博客网 时间:2024/05/16 04:55

 原文是我在学习Spring的过程中,在Spring的官网上看到的一个指南:BuildingJava Projects with Maven——http://spring.io/guides/gs/maven/#scratch。我也是刚接触Maven。看到这篇文章觉得非常简单,但又非常实用,尤其是对于像我这样的Maven初学者。基本上看了这篇后能大概知道Maven是个什么东西,干点什么事,并能够上手使用Maven做点小例子。所以忍不住就把它整理成中文,发出来分享一下,帮助初学者。并没有对原文完整翻译,更没有逐句翻译,只对自己觉得需要进行整理。

开始吧。

首先,你需要创建一个java工程,后续Maven将对它进行构建。为了保持关注Maven,我们将建立一个尽可能简单的工程。

   建立工程的目录结构如下:       

└── src       └── main              └── java                     └── hello

在这个目录下面(hello包下),创建两个类:
HelloWorld.java和Greeter.java。

package main.java.hellopublic 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/mavenJava version: 1.7.0_09, vendor: Oracle CorporationJava home: /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jreDefault locale: en_US, platform encoding: UTF-8OS 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。

 


0 0