Maven入门

原文1

原文2
maven-shade-plugin

你要做的东西

通过Maven来构建一个显示当天时间的应用。

你需要的东西

  • 15分钟
  • 你喜欢的文本编辑器或者IDE
  • JDK 8 或者更新

如何完成这个指南

我是新手,走最基础的方式


创建项目

首先,你需要创建一个项目用来给Maven构建。把注意力集中到Maven上,项目做得尽可能简单。项目结构如下。

src
	main
		java
			hello

找个文件夹先创建一下目录 mkdir -p src/main/java/hello,然后创建2个类。HelloWorld.javaGreeter.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>来指定他们的作用域。还有两种:

  1. provided 编译+运行时可用。
  2. 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/javaTest结尾的类。下面来运行。

小结

恭喜,你完成了。

posted @ 2019-04-03 15:42  Sheldon_Lou  阅读(268)  评论(0编辑  收藏  举报