Maven入门
你要做的东西
通过Maven来构建一个显示当天时间的应用。
你需要的东西
- 15分钟
- 你喜欢的文本编辑器或者IDE
- JDK 8 或者更新
如何完成这个指南
我是新手,走最基础的方式
创建项目
首先,你需要创建一个项目用来给Maven构建。把注意力集中到Maven上,项目做得尽可能简单。项目结构如下。
src
main
java
hello
找个文件夹先创建一下目录 mkdir -p src/main/java/hello
,然后创建2个类。HelloWorld.java
和 Greeter.java
代码如下:
package hello;
public class HelloWorld {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.sayHello());
}
}
package hello;
public class Greeter {
public String sayHello() {
return "Hello world!";
}
}
这样就有了一个可以用Maven构建的项目,下一步就是要安装Maven。
安装Maven
Maven可以在链接下载。只需要二进制文件就好,像apache-maven-*{version}*-bin.zip
或apache-maven-*{version}*-bin.tar.gz
这样的链接。
下载完成之后解压,然后把解压出来的bin
目录添加到PATH
环境变量中。
先检查一下JAVA_HOME环境变量的值。
echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
然后修改PATH
的值
export PATH=/opt/apache-maven-3.6.0/bin:$PATH
然后用mvn -v
测试一下
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
成功安装。
跳过Maven Wrapper
相关的介绍
定义一个简单的Maven构建
按照上面步骤装好Maven,现在需要创建一个Maven项目的定义文件。通过pom.xml
来实现。这里可以指定项目的名称,版本,外部依赖项。
在项目的根目录创建一个_pom.xml_文件,和src文件夹同级,内容如下。
<?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>
<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>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>
元素,这是一个最简单的用来构建项目的pom 配置文件。他包括以下几点:
<modelVersion>
pom文件模型的版本。一直是4.0。<groupId>
表示项目所属的组或组织,通常是反过来写的域名。<artifactId>
项目最后生成的文件的名字,比如jar 或者 war文件的名字。<version>
项目的版本。<packaging>
打包的方式,默认是jar,也可以指定war。
当选择版本的时候,建议使用 链接方式。
记得要添加build节点,引用maven-shade-plugin
这个用于把代码打包成一个可执行的jar
编译java代码
现在可以用Maven来编译你的项目了。可以用Maven做到以下几点:
- 编译你的项目代码
mvn compile
完成之后在 target/classes 目录下会生成编译好的.class 文件。
- 创建jar包
mvn package
package命令会编译代码+运行测试+生成jar文件。jar文件名是依据pom里面设置的artifactId和version来的。
- 在本地Maven仓库安装依赖
Maven也会在本机上维护依赖项。通常是在.m2/repository
目录以便下次用到的时候尽快访问到。如果你想把你项目的jar文件安装到本地仓库,你需要使用install命令。
mvn install
这个命令会编译,测试,打包你的代码,然后安装到本地仓库,用于其他项目的依赖引用。
声明依赖项
上面的项目很简单,没有依赖其他任何库。但通常来说,大部分项目都是需要依赖外部库来处理一系列问题。
举个例子说,我们需要使用Joda
这个库来打印当前时间。
首先改一下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());
}
}
如果直接运行mvn compile
,编译会报错。我们需要在<project>
节点中增加下面内容。
<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
上面的xml定义了项目需要用到的依赖项。group,artifactId,version和上面的意思一样。dependency默认的作用域是compile
,这意味着他们的在编译期间是可用的。可以通过<scope>
来指定他们的作用域。还有两种:
provided
编译+运行时可用。test
编译+测试时可用,运行时不可用。
再次运行compile,mvn就会去下载对应的dependency。
编写测试
第一步,添加一下JUnit依赖到pom.xml文件中,作用域是test。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
创建一个src/test/java/hello/GreeterTest
测试用例
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
结尾的类。下面来运行。
小结
恭喜,你完成了。