本文带你用Maven编译一个简单的Java项目。
创建一个简单的Java项目,然后用Maven编译。
我们首先需要创建项目一个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。
你可以从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项目都会定义一个XML文件:pom.xml。这个文件提供了项目的名称、版本和外部库的依赖。
在项目根目录新建一个pom.xml文件,文件内容如下:
4.0.0
com.hansy
learn-maven
jar
0.1.0
1.8
1.8
org.apache.maven.plugins
maven-shade-plugin
2.1
package
shade
hello.HelloWorld
除去可选的
现在,我们完成了一个最小的,但是能够用Maven编译的项目。
Maven已经准备好编译项目了。你现在可以用Maven执行多种编译流程目标,包括:
为了编译源码,运行如下命令:
mvn compile
这个命令会运行Maven,执行编译操作。执行完成之后,你会在target/classes文件夹里面找打编译好的*.class* 文件。
因为一般不会直接发布或者使用*.class*文件,你可能直接运行打包操作:
mvn package
打包命令的具体操作:编译Java源码,运行所有的测试,最后在 target 文件夹里面把编译好的字节码打包成JAR文件。JAR文件的文件名基于pom.xml文件里面的
执行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里面添加如下内容(在
joda-time
joda-time
2.9.2
这个XML代码块声明了项目的依赖列表。本项目只声明了一个Joda Time的依赖。在
默认的情况下,所有的依赖的作用域都是“compile”。也就是,依赖必须在编译时可用(如果打包成WAR文件的话,依赖的类库会包含在WAR包的*/WEB-INF/libs*文件夹下面)。
此外,你还可能用到如下的两个作用域:
现在再运行mvn compile或者mvn package命令,Maven都可以从Maven Central仓库中获取到 Joda Time依赖了。
首先,在pom.xml文件里面添加JUnit和hamcrest库的依赖,作用域设置为test:
junit
junit
4.12
test
org.hamcrest
hamcrest-library
2.2
test
然后创建一个测试用例如下:
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文件如下:
4.0.0
com.hansy
learn-maven
jar
0.1.0
1.8
1.8
joda-time
joda-time
2.9.2
junit
junit
4.12
test
org.hamcrest
hamcrest-library
2.2
test
org.apache.maven.plugins
maven-shade-plugin
2.1
package
shade
hello.HelloWorld
pom.xml文件中使用了maven-shade-plugin插件,这个插件使我们可以简单便捷的生成可执行的JAR文件。
你已经创建了一个简单但是有效的Maven编译配置文件,可以正常的编译Java项目了。
learn-maven
https://spring.io/guides/gs/maven/