使用Maven编译Java项目
本文带你用Maven编译一个简单的Java项目。本文目标创建一个简单的Java项目,然后用Maven编译。你需要15分钟左右文本编辑器或者IDEJDK 8+创建项目我们首先需要创建项目一个Java项目。为了专注于Maven的操作,这个Java项目越简单越好。创建文件夹结构在你选择的项目文件夹下面,创建子文件夹。Windows系统的话,在命令行运行命令 :mkdir src\main\java\he
本文带你用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项目了。
源码下载
参考资料
更多推荐
所有评论(0)