本文带你用Maven编译一个简单的Java项目。

本文目标

创建一个简单的Java项目,然后用Maven编译。

你需要

  • 15分钟左右
  • 文本编辑器或者IDE
  • JDK 8+

创建项目

我们首先需要创建项目一个Java项目。为了专注于Maven的操作,这个Java项目越简单越好。

创建文件夹结构

在你选择的项目文件夹下面,创建子文件夹。
Windows系统的话,在命令行运行命令 :

mkdir src\main\java\hello

*nix系统的话,在运行命令 :

mkdir -p src/main/java/hello

最后文件夹结构如下:

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

src/main/java/hello文件夹下面,你可以按自己的想法创建任何Java类。为了简单起见,我们只创建两个类: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。
你可以从https://maven.apache.org/download.cgi上面下载Maven的二进制文件。我们只需要二进制文件,可以直接去找apache-maven-{version}-bin.zip或者apache-maven-{version}-bin.tar.gz文件来下载(例如apache-maven-3.6.3-bin.zip)。

下载下来之后,解压压缩包,然后把里面的bin文件夹添加到你的电脑的 高级系统设置 => 环境变量 => 系统变量 => path 里面。

为了测试Maven是否安装成功,用命令行运行命令:

mvn -v

如果安装成功,可以看到Maven的安装和环境信息如下(版本号可能不同):

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: D:\Program Files\Maven\apache-maven-3.6.3\bin\..
Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_231\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

这样Maven就安装成功了。

定义一个简单的Maven配置文件

Maven安装成功之后,我们就可以定义一个Maven项目配置文件了。Maven项目都会定义一个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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hansy</groupId>
    <artifactId>learn-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> 元素,这已经是编译一个Java项目所需要的最简单的pom.xml文件了。它包含了如下的项目配置元素:

  • <modelVersion>。POM模型版本(Maven2和3一直是4.0.0)
  • <groupId>。这个项目所属的分组或机构。经常表示为一个反向的域名。
  • <artifactId>。项目的名称(例如:JAR或者 WAR文件的名字)。
  • <version>。项目的版本。
  • <packaging>。项目打包的方式。默认是"jar",将会打包成JAR文件。设置成"war"的话,将会打包成WAR文件。

现在,我们完成了一个最小的,但是能够用Maven编译的项目。

编译Java代码

Maven已经准备好编译项目了。你现在可以用Maven执行多种编译流程目标,包括:

  • compile:编译项目源码
  • package:生成一个库包(比如一个JAR文件)
  • install:安装生成的库包到本地的Maven依赖仓库

为了编译源码,运行如下命令:

mvn compile

这个命令会运行Maven,执行编译操作。执行完成之后,你会在target/classes文件夹里面找打编译好的*.class* 文件。

因为一般不会直接发布或者使用*.class*文件,你可能直接运行打包操作:

mvn package

打包命令的具体操作:编译Java源码,运行所有的测试,最后在 target 文件夹里面把编译好的字节码打包成JAR文件。JAR文件的文件名基于pom.xml文件里面的<artifactId>和<version>。你的pom.xml如果跟上面的一样的话,生成出来的JAR文件的文件名将会是learn-maven-0.1.0.jar

执行JAR文件:

java -jar target/learn-maven-0.1.0.jar

为了快速访问项目依赖,Maven维护着一个本地依赖仓库(默认在用户文件夹的 .m2/repository 下面)。如果你想把项目的JAR包安装到本地仓库里面,你可以运行安装命令:

mvn install

安装命令的具体流程:编译,测试,打包,最后把打包好的项目复制到本地仓库。这样你的项目就可以提供给本地的其他项目作为依赖使用了。

提到依赖,接下来会说明一下怎么在Maven配置文件里面声明依赖。

声明依赖

我们刚才创建的Hello World项目是完全自包含的,没有依赖额外的类库。但是,大部分的应用,都会使用外部的类库,来处理一些简单的或者复杂的功能。

比如说,我们除了输出"Hello World!",还想打印出当前日期和时间。Java自带的日期和时间工具库可以这个要求,但是你也可以使用一个外部的Joda Time库来实现这个功能。

首先,修改 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 命令,编译过程会失败(提示错误:程序包org.joda.time不存在),因为你还没有声明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*文件夹下面)。

此外,你还可能用到如下的两个作用域:

  • provided :在编译的时候需要该依赖,但是运行时由执行程序的容器来提供该依赖(例如:Java Servlet API)。
  • test :在编译和测试的时候需要该依赖,但是打包和运行的时候就不要这个依赖了。

现在再运行mvn compile或者mvn package命令,Maven都可以从Maven Central仓库中获取到 Joda Time依赖了。

写一个测试

首先,在pom.xml文件里面添加JUnit和hamcrest库的依赖,作用域设置为test

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>org.hamcrest</groupId>
	<artifactId>hamcrest-library</artifactId>
	<version>2.2</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

显示结果如下:

......
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running hello.GreeterTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.826 s
[INFO] Finished at: 2020-07-14T16:57:19+08:00
[INFO] ------------------------------------------------------------------------

或者也可以像上面那样直接使用 mvn install 命令(因为安装流程中包含着测试流程)。

最终的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>com.hansy</groupId>
    <artifactId>learn-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>
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-library</artifactId>
			<version>2.2</version>
			<scope>test</scope>
		</dependency>
	</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编译配置文件,可以正常的编译Java项目了。

源码下载

learn-maven

参考资料

https://spring.io/guides/gs/maven/

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐