# 使用Maven构建Java项目
本指南将引导您逐步使用Maven构建一个简单的Java项目。
## 你会建立什么
您将创建一个提供一天中时间的应用程序,然后使用Maven进行构建。
## 你需要什么
* 约15分钟
* 最喜欢的文本编辑器或IDE
* [JDK 8](https://openjdk.java.net/install/) 或更高版本
## 如何完成本指南
像大多数Spring 一样 [入门指南](https://spring.io/guides) ,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。 无论哪种方式,您最终都可以使用代码。
要 **从头开始** ,请继续以 [设置项目](https://spring.io/guides/gs/maven/#scratch) 。
要 **跳过基础知识** ,请执行以下操作:
* [下载](https://github.com/spring-guides/gs-maven/archive/master.zip) 并解压缩本指南的源存储库,或使用 对其进行克隆 [Git](https://spring.io/understanding/Git) : `git clone [https://github.com/spring-guides/gs-maven.git](https://github.com/spring-guides/gs-maven.git)`
* 光盘进入 `gs-maven/initial`
* 跳至 [\[initial\]](https://spring.io/guides/gs/maven/#initial) 。
**完成后** ,您可以根据中的代码检查结果 `gs-maven/complete`.
## 设置项目
首先,您需要设置一个Java项目供Maven构建。 为了专注于Maven,现在使该项目尽可能简单。 在您选择的项目文件夹中创建此结构。
### 创建目录结构
在您选择的项目目录中,创建以下子目录结构; 例如, `mkdir -p src/main/java/hello` 在\* nix系统上:
~~~
└── src
└── main
└── java
└── hello
~~~
内 `src/main/java/hello`目录中,您可以创建所需的任何Java类。 为了与本指南的其余部分保持一致,请创建以下两个类: `HelloWorld.java` 和 `Greeter.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。
Maven可作为zip文件从 下载 [https://maven.apache.org/download.cgi](https://maven.apache.org/download.cgi) 。 仅需要二进制文件,因此请查找指向apache-maven- *{version}* \-bin.zip或apache-maven- *{version}* \-bin.tar.gz的链接。
下载zip文件后,将其解压缩到计算机上。 然后将 添加 *bin* 文件夹 到您的路径。
要测试Maven安装,请运行 `mvn` 从命令行:
~~~
mvn -v
~~~
如果一切顺利,应该向您提供有关Maven安装的一些信息。 它看起来将类似于以下内容(尽管可能与以下内容略有不同):
~~~
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /home/dsyer/Programs/apache-maven
Java version: 1.8.0_152, vendor: Azul Systems, Inc.
Java home: /home/dsyer/.sdkman/candidates/java/8u152-zulu/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-36-generic", arch: "amd64", family: "unix"
~~~
恭喜你! 您现在已经安装了Maven。
信息:您可能想考虑使用 [Maven包装器](https://github.com/takari/maven-wrapper) 来隔离开发人员,使其避免拥有正确版本的Maven或完全安装它。 从 下载的项目 [Spring Initializr](https://start.spring.io) 都包含包装器。 它显示为脚本 `mvnw` 在您运行的项目的顶层 `mvn`.
## 定义一个简单的Maven构建
现在已经安装了Maven,您需要创建一个Maven项目定义。 Maven项目是使用名为 的XML文件定义的 *pom.xml* 。 除其他外,该文件提供了项目的名称,版本以及它对外部库的依赖关系。
创建一个名为 的文件 *pom.xml* 在项目的根目录下 (即,将其放在 `src` 文件夹),并提供以下内容:
`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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</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>`元素,这是 的最简单的 *pom.xml* 构建Java项目所需 文件。 它包括以下项目配置的详细信息:
* `<modelVersion>`。 POM模型版本(始终为4.0.0)。
* `<groupId>`。 项目所属的组或组织。 通常表示为反向域名。
* `<artifactId>`。 要赋予项目的库工件的名称(例如,其JAR或WAR文件的名称)。
* `<version>`。 正在构建的项目的版本。
* `<packaging>`\-如何打包项目。 对于JAR文件打包,默认为“ jar”。 使用“ war”进行WAR文件打包。
在选择版本控制方案时,Spring建议使用 语义版本控制 方法。
至此,您已经定义了一个最小但功能强大的Maven项目。
## 建立Java程式码
Maven现在准备构建该项目。 您现在可以使用Maven执行几个构建生命周期目标,包括编译项目代码,创建库包(例如JAR文件)以及在本地Maven依赖项存储库中安装库的目标。
要尝试构建,请在命令行中发出以下命令:
~~~
mvn compile
~~~
这将运行Maven,告诉它执行 *编译* 目标。 完成后,您应该 找到已编译的 *.class* 在 文件 *target / classes* 目录中 。
由于您不太可能希望直接分发或使用 *.class* 文件,因此您可能需要运行 *程序包* 目标:
~~~
mvn package
~~~
该 *包装* 目标将编译Java代码,运行任何测试,并通过在内部的JAR文件将代码打包了完成 *目标* 目录。 JAR文件的名称将基于项目的 `<artifactId>` 和 `<version>`。 例如,给定之前的最小 *pom.xml* 文件,则JAR文件将命名为 *gs-maven-0.1.0.jar* 。
要执行JAR文件,请运行:
~~~
java -jar target/gs-maven-0.1.0.jar
~~~
如果您更改了 <packaging>从“ jar”到“ war”,结果将是 的WAR文件 目标 目录中 而不是JAR文件。
Maven还维护本地计算机上的依赖项存储库(通常在 中的 *.m2 / repository* 主目录 目录中),以快速访问项目依赖项。 如果要将项目的JAR文件安装到该本地存储库,则应调用 `install` 目标:
~~~
mvn install
~~~
在 *安装* 目标将编译,测试和打包项目的代码,然后将其复制到本地依赖性库,准备好另一个项目中引用它作为一个依赖。
说到依赖,现在是时候在Maven构建中声明依赖了。
## 声明依赖
简单的Hello World示例是完全独立的,并且不依赖于任何其他库。 但是,大多数应用程序都依赖于外部库来处理常见和复杂的功能。
例如,假设除了说“ Hello World!”外,您还希望应用程序打印当前日期和时间。 虽然可以使用本机Java库中的日期和时间工具,但可以使用Joda Time库使事情变得更有趣。
首先,将HelloWorld.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>` -所需的特定版本的库。
默认情况下,所有依赖项的作用域为 `compile`依赖关系。 也就是说,它们应该在编译时可用(如果您正在构建WAR文件,包括在WAR的 */ WEB-INF / libs* 文件夹中)。 此外,您可以指定一个 `<scope>` 元素以指定以下范围之一:
* `provided` -编译项目代码所需的依赖关系,但将在运行时由运行该代码的容器(例如Java Servlet API)提供。
* `test` -用于编译和运行测试的依赖项,但对于构建或运行项目的运行时代码不是必需的。
现在,如果您运行 `mvn compile` 或者 `mvn package`,Maven应该从Maven Central存储库中解决Joda Time依赖关系,并且构建将成功。
## 编写测试
首先在测试范围内将JUnit作为对pom.xml的依赖项添加:
~~~
<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` 如我们上面已经显示的步骤(存在一个生命周期定义,其中“测试”作为“安装”的一个阶段包括在内)。
这是完成的 `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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-maven</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<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>3.2.4</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插件 ,以使JAR文件具有可执行性。 本指南的重点是开始使用Maven,而不是使用此特定插件。
## 概括
恭喜你! 您已经创建了一个简单而有效的Maven项目定义来构建Java项目。
- springboot概述
- springboot构建restful服务
- spring构建一个RESTful Web服务
- spring定时任务
- 消费RESTful Web服务
- gradle构建项目
- maven构建项目
- springboot使用jdbc
- springboot应用上传文件
- 使用LDNA验证用户
- 使用 spring data redis
- 使用 spring RabbitTemplate消息队列
- 用no4j访问nosql数据库
- springboot验证web表单
- Spring Boot Actuator构j建服务
- 使用jms传递消息
- springboot创建批处理服务
- spring security保护web 安全
- 在Pivotal GemFire中访问数据
- 使用Spring Integration
- 使用springboot jpa进行数据库操作
- 数据库事务操作
- 操作mongodb
- springmvc+tymleaf创建web应用
- 将Spring Boot JAR应用程序转换为WAR
- 创建异步服务
- spring提交表单
- 使用WebSocket构建交互式Web应用程序
- 使用REST访问Neo4j数据
- jquery消费restful
- springboot跨域请求
- 消费SOAP Web服务
- springboot使用缓存
- 使用Vaadin创建CRUD UI
- 使用REST访问JPA数据
- 使用REST访问Pivotal GemFire中的数据
- 构建soap服务
- 使用rest访问mongodb数据
- 构建springboot应用docker镜像
- 从STS部署到Cloud Foundry
- springboot测试web应用
- springboot访问mysql
- springboot编写自定义模块并使用
- 使用Google Cloud Pub / Sub进行消息传递
- 构建反应式RESTful Web服务
- 使用Redis主动访问数据
- Spring Boot 部署到Kubernetes
- 使用反应式协议R2DBC访问数据
- Spring Security架构
- spring构建Docker镜像详解
- Spring Boot和OAuth2
- springboot应用部署到k8s
- spring构建rest服务详解