美文网首页
通过Maven构建Java项目

通过Maven构建Java项目

作者: 关中大吕 | 来源:发表于2017-09-14 14:39 被阅读0次

本指南将指导你利用Maven构建一个简单的Java项目。

你所构建

你将使用Maven来构建一个应用程序,它将提供一天中的时间。

你所需要

  • 大约15min
  • 一个你喜欢的代码编译器
  • JDK6或者更高版本

如何完成本指南

想大多数的Spring入门指南一样,你可以从头开始然后完成每一步,或者你可以绕过已经熟悉的基本设置步骤。无论哪种方法,你都会得到工作代码。

想从头开始?请移步设置项目

跳过了基础设置?继续看以下内容:

  • 下载并解压本指南的源储存库,或者通过Git clone本指南:git clone https://github.com/spring-guides/gs-maven.git
  • cd 进入gs-maven/initial
  • 跳转到初始化

当你完成之后,你可以根据gs-maven/complete中的代码检验结果。

设置项目

首先你需要通过Maven来构建一个Java项目,只需要注意Maven,至于这个项目可以尽量的简单

创建目录结构
在你选中的项目目录中,创建以下子目录结构;例如,在Unix/Linux系统中使用命令 mkdir -p src/main/java/hello

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

src/main/java/hello这个目录中,你可以创建任何你想要的Java class文件。为了保持与本指南其余部分的一致,创建以下两个class文件:HelloWorld.javaGreeter.java

src/main/java/hello/HelloWorld.java

package hello;

public class HelloWorld {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
    }
}

src/main/java/hello/Greeter.java

package hello;

public class Greeter {
    public String sayHello() {
        return "Hello world!";
    }
}

至此你已经有了一个可以用Maven来构造的项目,接下来就是安装Maven。

你可以通过http://maven.apache.org/download.cgi下载作为压缩文件的Maven。只需要二进制文件,所以只需要找到apache-maven-{version}-bin.zipapache-maven-{version}-bin.tar.gz的连接即可。

下载压缩文件并解压它,之后将它bin文件夹的路径添加到环境变量path中。

若想测试Maven的安装情况,在命令行执行以下命令:
mvn - v

如果一切正常,你可以看到一些关于Maven的安装信息,例如下面所展示的内容(可能有些轻微的区别):

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的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);
  • <gropId>,本项目属于哪一个项目组,通常用它的反转域名作为名称;
  • <artifactId>,给与项目artifact的名称(例如,那些名字中包含JAR和WAR的文件)
  • <version>,正在构造的项目的版本
  • <packaging>,项目应该以哪种形式被打包,默认用“jar”打包JAR文件,用“war”打包JAR文件。

当谈到选择一个版本控制方案,Spring推荐使用semantic versioning

在这一点上,你已经定义了一个最小但是又有能力的Maven项目!

构建Java代码

Maven现在已经准备好构建你的项目了!你可以使用Maven执行几个构建生命周期目标,其中包括编译你的项目代码,创建库包(如JAR文件 ),并将库安装到本地Maven依赖关系库中。
若想尝试构建,请在命令行输入以下命令:
mav compile
它会运行Maven,通知Maven运行编译这个功能。当编译完成,你可以在target/classes目录中找到那个被编译的.class文件
由于你不可能直接分发或使用.class文件,你可能跟你想运行包命令:
mvn package
打包命令将编译你的Java代码,运行所有的测试用例,然后把代码导报成一个JAR文件,放在target文件夹中。JAR文件的命名基于项目的<artifactId><version>。举个栗子,在前面提到的最基本的pom.xml,它的JAR文件将被命名为gs-maven-0.1.0.jar

如果你改变了<packaging>中的值,从“jar”变成“war”,那么结果将是target中的文件是WAR,而不是JAR文件。

为了快速访问项目的依赖,Maven在本机维护了一个依赖关系库(通常是在.m2/repository这个目录下)。如果你想安装项目的JAR文件到本地库,只需要执行install命令
mvn install
这个命令将编译、测试和打包你项目的代码,然后把它拷贝到依赖关系库中,为其他项目
同一个依赖参考。
说了这么久的依赖,是时候在Maven构建中声明依赖关系了。

声明依赖

Hello World这个简单的实示例完全的独立的,并不需要依赖其他的外部库。但是对于大多数应用来说,都需要依赖外部库来处理一些常见且复杂的功能。
举个栗子,假设除了say“Hello World!”,你还想让这个应用打印出当前的日期和时间,虽然你可以使用Java库中的日期和时间工具,但如果使用Joda Time库来操作,会变得非常有趣。
首先,修改你的Hello World.java文件,就像以下这样:
src/main/java/hello/HelloWorld.java

package 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());
    }
}

这里的HelloWorld用了Joda Time的LocalTime类来获取当前的打印的时间。
如果你现在运行mvn compile来构建项目,这个构建必将失败,其原因是你还没有将Joda Time声明成一个编译依赖。你可以通过增加以下的代码到pom.xml文件(增加到<project>这个元素里)来修复这个问题:

<dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.2</version>
        </dependency>
</dependencies>

这个XMl快声明了项目的依赖关系列表,具体来说,它为Joda Time库声明了一个依赖关系。在<dependency>元素中,依赖坐标由三个子元素定义:

  • <groupId> - 这个依赖关系属于什么组织
  • <artifactId> - 被要求的库
  • <version> - 这个库被要求的具体版本

默认的,所有的依赖关系都作为编译依赖关系,意思是,他们将在编译时候被利用到(如果你正在构造一个WAR文件,包括在WAR的/WEB-INF/libs文件夹中)。另外,你可以指定<scope>元素来指定以下范围之一:

  • <provided> - 编译项目代码所需要的依赖关系,但运行时将由运行代码容器提供(例如Java Servlet API)
  • <test> - 依赖关系在编译和运行测试的时候将被用到,但是在构建或运行项目的运行代码不是必需的

那么现在,如果你再次运行mvn compile或者mvn package,Maven将从Maven中心库中解析Joda Time依赖,然后就构建成功了。

写一个测试

首先添加一个JUnit依赖到你的pom.xml文件中,作用域为test

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
</dependency>

接下来创建一个测试用例像以下所示:
src/test/java/hello/GreeterTest.java

package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;

import org.junit.Test;

public class GreeterTest {

    private Greeter greeter = new Greeter();

    @Test
    public void greeterSaysHello() {
        assertThat(greeter.sayHello(), containsString("Hello"));
    }

}

Maven使用一个名叫“surefire”的插件来运行单元测试,此插件默认配置是编译并运行在src/test/java中名称与*Test匹配的类。你可以通过以下的命令行来运行这些测试
mvn test
或者用mvn install,就像我们在上面已经提到过的那样(有一个生命周期定义,“test”被包括在“install”阶段)。
这里有一个完整的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>

    <dependencies>
        <!-- tag::joda[] -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- end::joda[] -->
        <!-- tag::junit[] -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- end::junit[] -->
    </dependencies>

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

这个完整的pom.xml文件使用Maven Shade Plugin来简化JAR文件的可执行性。本指南专注于开始使用Maven,而不是使用这个插件。

摘要

恭喜你!你已经创造了一个简单的有用的通过Maven定义并构造的Java项目

扩展浏览

下面的这个指南或许能更好的帮助到你

想要写一个全新的入门指南或者为现有的入门指南做贡献么?点击贡献指南

所有的指南都将发布ASLv2许可证的代码、Attribution还有为写作颁发的NoDerivatives creative commons license

原文地址:Building Java Projects with Maven

相关文章

  • IntelliJ IDEA - Maven介绍以及设置

    Maven负责管理和构建项目 通过IntelliJ IDEA的Maven骨架可以快速构建Java Web环境,在创...

  • Maven下载安装教程

    Maven 是最流行的 Java 项目构建系统,Maven项目对象模型(POM),可以通过一小段描述信息来管理项目...

  • 通过Maven构建Java项目

    本指南将指导你利用Maven构建一个简单的Java项目。 你所构建 你将使用Maven来构建一个应用程序,它将提供...

  • maven的基本概念

    maven是干嘛的 mvn是项目管理工具。通过mvn可以对java项目进行依赖管理和项目构建。 maven坐标的概...

  • 概述

    maven(几乎所有java项目都使用) maven功能:项目构建、依赖管理maven安装:https://mav...

  • Maven入门教程

    GitHub仓库:Fundebug/maven-tutorial Maven简介 Maven是Java项目构建工具...

  • 命令行下使用 maven 快速创建任意项目

    众所周知 java 项目构建中,maven 是不可或缺的项目构建工具,大部分人都会通过 archtype 来创建新...

  • jenkins—maven初试

    jenkins-gitlab容器实验maven构建 构建maven项目,在jenkin容器中安装java以及mav...

  • 一篇小短文让你了解Maven

    简介 Apache Maven是一个项目管理及构建工具,主要用于Java项目的构建,Maven还可以用于构建和管理...

  • Maven - 简介

    Maven简介 Maven是一个强大的Java项目构建工具。由于Maven是用Java开发的,因此Maven被更多...

网友评论

      本文标题:通过Maven构建Java项目

      本文链接:https://www.haomeiwen.com/subject/gkgcsxtx.html