Maven实战01—使用入门

Maven实战01—使用入门

我之前在知乎写了关于maven的教程,但是现在的我看来,内容过于浅显,甚至只讲了大概。现在开始连载一下maven的知识点。会比上次更加深入,不过对于大体的基础概念就不再重复了。所以我还是推荐你去看看我那篇不成熟的文章。传送门

安装与配置

在我曾经的知乎中有写到,本次教程mvn的编译打包统统都是用命令行完成。以下是maven项目的基础构造。对于maven来说约定大于配置。

尽量按照maven所要求的层级来开发,虽然maven也可以自定义,但是统一的风格会让项目有更好的可读性。总的来说就是src存放逻辑代码,src-main放实际代码,test中存放测试代码。src-resources代表静态资源。target代表着编译或者打包后的文件。pom文件就是依赖的文件。

项目层级

1.编写POM文件

1
2
3
4
5
6
7
8
9
10
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
</project>

这就是一个最简单的pom文件

代码第一行是xml头,指定了文档的版本和编码方式。

代码第二行是project元素,它是所有pom的根元素,里面的属性声明了一些POM相关的命名空间和xsd元素。一般来说这些都是固定的,不需要修改。

<modelVersion>4.0.0</modelVersion>这个标签指定了当前POM模型的版本,对于maven2及maven3来说,它只能是4.0.0 不过现在应该大部分都是maven3了吧。总之这个也不用我们管。

接下来就是三大巨头

1
2
3
4
<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>这是我的项目啦</name>

上述3个标签是我们所要关心,也是我们所要填写的。最后一个name是项目名称,倒不是必填的。groupId定义了项目属于哪个租,这个组和所在的组织和公司关联。比如你的公司是example,那么这个就填com.example。这个和Java包的命名规范是一样的,按照地址反向来写。org代表组织,edu代表教育机构等等,当然这肯定不会校验格式啥的,但最好还是按约定来,这样对大家都好。artifactId定义了当前maven项目在组中唯一的ID,比如我的为maven_demo。你可以理解为example公司下的一个产品,这个公司会有很多产品,但是在公司中,artifactId是唯一的。version很简单,就是这个产品的版本,SNAPSHOT名为快照,说明该项目还处于开发中,是不稳定的版本。

2.编写主代码

1
2
3
4
5
6
7
8
9
10
11
12
package com.example.mvnbook;

public class Helloworld {

public String sayHello(){
return "Hello Maven";
}

public static void main(String[] args) {
System.out.println(new Helloworld().sayHello());
}
}

项目主代码处于src的main中,项目的主代码最终会被打包到构建中(如jar),而测试代码(test文件中)只在运行测试时用到,不会被打包。我们按照maven的约定,创建目录,然后在该目录下创建文件com.example.mvnbook.Helloworld.java,代码如上面显示。

3.编译项目

在该项目的目录下打开命令行输入mvn clean compile你就会发现多了一个target的文件夹,里面有你代码的一些编译文件。clean命令执行的意思是清空target文件,compile是编译项目的意思。

4.编写测试代码

为了使项目结构保持清晰,主代码与测试代码应该分别位于独立的目录中。maven项目中默认的测试代码目录是/src/test/java。在编写测试用例之前,应当先创建该目录。

在Java中,Junit是事实上的单元测试标准,要使用JUnit,首先需要为项目添加一个依赖,修改项目的POM如下面代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>这是我的项目啦</name>

<!-- junit测试类-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

上述POM代码中还有一个<scope>test</scope>,这里的意思是在测试环境中,也就是test中使用该依赖没问题,但是不能在主代码中使用该依赖。

接着写测试类吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.mvnbook;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class HelloworldTest {

@Test
public void testSayHello(){
Helloworld helloworld = new Helloworld();
String result = helloworld.sayHello();
assertEquals("Hello Maven",result);
}
}

一个典型的单元测试包含三个步骤:1.准备测试类及数据;2.执行要测试的行为;3检查结果。上述代码初始化了需要测试的类,然后执行sayHello()方法并保存到result变量中,最后使用JUnit的Assert类检查结构是否为我们期望的”Hello Maven”

测试类名要以被测试类名+Test命名,这里为HelloworldTest,测试方法要以test+被测试的方法名命名,这里为testSayHello,同时测试方法要加@Test注解。一定要按规范来,否则maven可能识别不到测试的方法

然后输入mvn test就可以了,出现下面的代码就说明成功了。

1
2
3
4
5
6
7
8
9
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.example.mvnbook.HelloworldTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.098 sec

Results :

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

假如构建失败的话,可能你需要在maven中配置一下你的Java版本及其一些其他东西。

5.打包和运行

输入mvn clean package就可以打包了,和上面的一样,这也是先执行了clean,然后执行了package。最后你就可以在target中看到属于自己的包了,POM中没有指定打什么包,默认就是打jar包。

打包以后的文件

如果你的文件与我不同也不要怀疑自己错了,执行成功target文件夹里面有jar即可。那么怎么运行呢?默认打包生成的jar是不能运行的,我们需要配置一个插件。重新打一个可以运行的jar包。重新修改POM文件,加入一个插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>这是我的项目啦</name>

<!-- junit测试类-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>

<!--为了生成可执行的jar,需要借助maven-shade-plugin-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.example.mvnbook.Helloworld</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

最后重新打包就行mvn clean package

然后在target下运行Java命令就行。

运行效果图

结语

立刻操作一下吧,光看是不行的哦。有啥问题可以评论!