# 0.写在前面
首先回忆一下我们之前都做了什么:
1.成功在本机安装Maven软件,并配置了环境变量
2.成功配置了Maven的配置文件(conf/settings.xml文件),保证Maven能够通过我们指定的国内镜像下载jar文件,并将jar文件都保存在我们指定的文件夹当中
并且在创建Maven项目的时候默认使用JDK 1.8版本进行创建
3.成功配置了Eclispe下的Maven开发环境,并且保证能够快速创建一个基于Eclispe的Maven项目
4.能够知道在基于Eclipse的Maven项目中,在什么位置编写Java代码,在什么位置编写测试代码,并能够成功运行这个Maven项目
但是在获取如上成就的同时,我们必须知道:Maven本身是一个平台无关的开源工程,也就是说:
Maven可以为创建在任何开发平台上的Maven项目提供jar文件支持
那么同样也就是说:即使脱离了Eclispe、IDEA这样的开发平台,Maven也是可以直接运行,为项目提供jar文件支持的
那么下面这篇文章,将带领大家一起手动创建并编译、运行一个独立的Maven项目
并经由这个项目,补充一些关于Maven本身的其他知识点
# 1.创建Maven项目的文件夹目录
首先我们来看一个目录结构:
Maven项目:
|---src
|----|---main
|----|----|---java
|----|----|---resources
|----|---test
|----|----|---java
|----|----|---resources
|---pom.xml
怎么样?眼熟不?没错!这个就是我们之前在使用Eclipse创建Maven项目的时候,曾经见到过的Maven项目的最简结构
那么我们首先按照这个最简结构,在自己的磁盘上手动创建一个用于保存Maven项目Java文件和测试文件的文件夹结构
并且在这个文件夹中编写代码、添加POM文件,并逐步将这个项目进行编译和运行
1.手动创建Maven的最简目录结构:
# 2.配置Maven工程的pom.xml文件
Maven工程的pom.xml文件是Maven工程的灵魂,一个Maven项目下所有重要的信息和对jar文件的支持都是通过这个文件进行配置的
下面我们来手(shou)动(si)配置这个pom.xml文件
1.在项目的根文件夹下创建pom.xml配置文件,并创建如下基本结构:
<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>
</project>
上述配置属于Maven项目中pom.xml文件的基本配置方式,其中:
<modelVersion></modelVersion>标签标示的是当前Maven项目使用的描述规范版本号,
这个标签大家不必纠结,目前比较主流的Maven项目使用的描述规范版本号是4.0.0版本
注意:实际上上述配置我们也可以从Maven软件下的lib/maven-artifact-3.6.0.jar这个jar文件中找到相应的pom.xml文件的模板,并能够拷贝其中一些说明和案例
但是这种方式比较繁琐,不容易找到这个模板pom.xml文件,所以我们还是使用笔记中的配置文件内容
2.配置pom.xml文件中的项目坐标:
每一个Maven项目必须在pom.xml文件中配置如下内容,因为Maven就是根据这些配置信息来确定一个项目的具体位置的
所以下面我们将要配置的信息,也称之为一个项目的项目坐标
如何理解项目坐标:在时机生活中,坐标的概念就很普及:同样是在杨国福麻辣烫订的餐,为什么外码小哥能够准确的将你的那一份送到你的手中,而不是别人的手中呢?
对了!就是使用坐标。现实生活中我们使用省、市、区、街道、小区、栋、单元、楼层、门牌号等信息标识我们自己的坐标
所以外卖小哥能够按照这个“坐标”将外卖正确的送到你的手中。
同样的,在我们一台计算机当中,可能同时存在多个Java项目,那么Maven是如何对这些项目进行区分的呢?同样是使用项目坐标
所以说:项目坐标是Maven软件用来识别一个Java项目的唯一标识
就像我吃麻辣烫一定要加墨鱼丸,并且从来不吃香菜一样,Maven软件也是根据项目坐标来区分这个项目需要哪些jar文件,不需要哪些jar文件的
OK!现在应该已经能够理解项目坐标的含义了吧?那么下面我们来介绍一下如何配置一个Maven项目的项目坐标:
首先说明下:项目坐标直接配置在pom.xml文件的<project></project>标签之下
描述一个项目坐标的标准结构如下:
<project>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<packaging></packaging>
<classifier></classifier>
</project>
这些标签的配置信息含义如下:
<groupId>标签:标识当前Maven项目隶属于的实际项目名称。需要注意的是:Maven项目和实际项目不一定是一对一的关系。
比如SpringFrameWork这一实际项目,其对应的Maven项目会有很多,如spring-core,spring-context等。
这是由于Maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。
这个概念类似于Java工程中的“父子工程”的概念,而groupId标识的就是当前这个自工程隶属于的父级工程的名称
如果这个工程只有自己,不需要依赖于任何实际工程(父级工程),那么这个标签中直接写当前项目的名称即可
<artifactId>标签:这个标签下标识的就是当前项目的名称。在Maven的概念中,也就是“当前模块”的名称
对于<artifactId>标签中的取值,我们建议使用当前项目(模块)的真实名称
<version>标签:表示当前项目的版本号
<packaging>标签:表示当前项目的打包方式,除了常见取值"jar"之外,还可以取值"war",表示将当前工程打包为一个war文件
<classifier>标签:用来表示当前项目在打包生成的时候产生的一些附件文件
怎么样,上面的标签很多吧?刚开始手动配置项目的时候,配到这里,我也是一脸疑(meng)惑(bi)
但是后来我发现:在真正创建一个Maven项目的时候,根本用不上这么多坐标,Maven项目必须的坐标标签只有前3个!
下面我们来看一下如何配置我们当前这个项目的坐标:
将如下标签内容拷贝到之前创建的pom.xml文件的<project></project>标签之下
<!-- 我们这个项目已经是顶级项目了,不需要依赖任何上层的父级项目,所以groupId标签的取值就是当前项目名称 -->
<groupId>MavenTest</groupId>
<!-- 同理,这个项目的artifactId标签的取值也是这个项目名称本身 -->
<artifactId>MavenTest</artifactId>
<!-- 项目的版本号:0.0.1-SNAPSHOT -->
<version>0.0.1-SNAPSHOT</version>
在将上述配置拷贝的pom.xml文件之下后,我们得到这样一个pom.xml文件的内容:
<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">
<!-- 描述当前项目使用的描述规范为Maven 4.0.0规范 -->
<modelVersion>4.0.0</modelVersion>
<!-- 配置当前Maven项目的项目坐标 -->
<!-- 我们这个项目已经是顶级项目了,不需要依赖任何上层的父级项目,所以groupId标签的取值就是当前项目名称 -->
<groupId>MavenTest</groupId>
<!-- 同理,这个项目的artifactId标签的取值也是这个项目名称本身 -->
<artifactId>MavenTest</artifactId>
<!-- 项目的版本号:0.0.1-SNAPSHOT -->
<version>0.0.1-SNAPSHOT</version>
</project>
完美!到此为止,我们关于项目坐标的配置就完成了
关于项目版本号的说明:
Maven项目的<version>标签中使用的版本号,除了0.0.1这个数字版本号之外,还有一个版本类型:SNAPSHOT
这个单词的意思是快照版本。那么项目的版本类型都分为哪几种呢?
1.snapshot:快照版本,也就是开发版本,这个版本的项目是不能够使用的,因为正在处于开发阶段,功能不全,错误也很多
Eclispe在创建Maven项目的时候默认会使用这个版本
2.alpha:内部测试版,此版本的程序也不推荐使用,这个版本的程序用在开发人员内部进行测试,寻找并更改bug
3.beta:外部测试版,面向用户群体发布的测试版本,虽然能够使用,但是仍然不稳定,存在较多bug,不推荐使用
4.release:发行版,表示官方推荐使用的版本,功能较为全面,并且运行稳定,但是慧慧存在一些bug,可以正常使用
5.stable:稳定版,在发行版的基础上去除绝大部分bug,优化一些功能,建议使用
6.current:最新版本,不一定是稳定版本,但是具有最新的功能,如果有对应的发行版或者稳定版,建议使用前两者
7.eval:评估版本,具有一个月或者固定的使用期限
此外,还有pre、RC、GA等版本,在此不进行详细描述。
参考博文:https://www.jianshu.com/p/aefe0453d081
3.在pom.xml文件中添加jar文件依赖:
我们学习Maven的目的就是为了让Maven为我们的项目自动添加和管理所需的jar文件
并且在之前的文章中我们已经介绍过如何向pom.xml文件中添加项目所需jar文件的依赖配置,在河里我们不再进行赘述
为了方便当前项目的测试,我们在pom.xml文件中添加junit-4.12版本的jar文件依赖:
<!--
所有jar文件依赖的声明都放在<dependencies>标签下的子标签<dependency>当中
每一个依赖单独创建一个<dependency>子标签
-->
<dependencies>
<!-- 对junit-4.12版本的jar文件依赖声明 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
将上述配置内容加入pom.xml文件之后,我们得到了一个比较全面的pom.xml文件版本:
<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">
<!-- 描述当前项目使用的描述规范为Maven 4.0.0规范 -->
<modelVersion>4.0.0</modelVersion>
<!-- 配置当前Maven项目的项目坐标 -->
<!-- 我们这个项目已经是顶级项目了,不需要依赖任何上层的父级项目,所以groupId标签的取值就是当前项目名称 -->
<groupId>MavenTest</groupId>
<!-- 同理,这个项目的artifactId标签的取值也是这个项目名称本身 -->
<artifactId>MavenTest</artifactId>
<!-- 项目的版本号:0.0.1-SNAPSHOT -->
<version>0.0.1-SNAPSHOT</version>
<!--
所有jar文件依赖的声明都放在<dependencies>标签下的子标签<dependency>当中
每一个依赖单独创建一个<dependency>子标签
-->
<dependencies>
<!-- 对junit-4.12版本的jar文件依赖声明 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
到此为止,整个Maven工程的pom.xml配置文件就已经搞定了,下面让我们来写一些Java代码
# 3.在Maven工程中编写Java代码
Maven工程是严格区分Java原码和测试代码的,这些代码会被分别存放在不同位置下
并且在之后的编译和运行过程中我们也会看到,Maven对Java原码和测试代码的变异和运行也是截然不同的
1.编写Java原码:
Maven项目下所有的Java源代码都是统一存放在src/main/java这个文件夹下的
那么我们在这个文件夹下创建如下Java源文件和代码:
HelloMaven.java:
package com.oracle.test;
public class HelloMaven {
private String msg = "Hello Maven!";
public void sayHi() {
System.out.println(msg);
}
}
2.编写测试代码:
Maven项目下的所有测试代码存放在src/test/java这个文件夹下
那么我们在这个文件夹下创建如下的测试类和测试代码:
TestMaven.java:
package com.oracle.test;
import org.junit.Test;
public class TestMaven {
@Test
public void test1() {
HelloMaven hm = new HelloMaven();
hm.sayHi();
}
}
到此为止,我们Maven工程中的Java代码就已经写好了
在上述步骤中,我们需要重点掌握的是:Maven项目中,Java源代码和测试代码的存放路径的位置
# 4.编译和运行Maven项目
Maven项目在创建完成后,需要手动对项目进行编译(有点儿javac的感jio)
并且,因为在测试代码中用到了Java原码中创建的HelloMaven这个类型,所以我们必须按照如下顺序对项目进行编译:
1.首先编译src/main/java文件夹下的Java原码
2.其次编译src/test/java文件夹下的测试代码
只有按照这个顺序进行编译,才能够保证测试代码能够正常运行
1.编译Java源代码:
首先我们需要启用命令控制台,并进入Maven项目的根目录下:
然后通过如下命令对Maven项目中的原码进行编译:
mvn compile
注意:如果是第一次编译Maven项目,那么Maven将会从远程的中央仓库中下载所需的jar文件到本地仓库中
如果我们已经配置过使用镜像进行下载,那么这个下载过程将会快得多
(为了进行演示,我把本地仓库中所有已经下载好的jar文件都删了……)
项目编译成功后将会有如下结果:
首先是在命令控制台中会显示如下结果内容:
其次是在src文件夹下,会出现一个名为target的新文件夹,这个文件夹中负责保存当前已经编译好的所有Java文件的字节码文件:
2.编译并运行测试代码:
Maven工程下的测试代码的编译和运行使用的是同一个命令:
mvn test
也就是说,在运行上述命令的时候,Maven会同时执行如下3个操作:
1.根据pom.xml配置文件中声明的项目使用的jar文件依赖,去中央仓库将所需的jar文件下载到本地仓库中
2.编译测试代码,生成其对应的字节码文件
3.直接执行测试类中的测试方法,打印测试结果
下载jar文件到本地仓库的过程:
编译测试文件并运行测试方法,得到运行结果:
3.Maven项目的清理:
如果需要清空已经编译生成好的Java原码和测试代码的字节码文件,我们可以使用如下命令:
mvn clean
Maven正在清理项目:
清理完成:
在运行这个命令后,Maven会自动删除项目根目录下的target文件夹:
到此为止,我们手动创建、配置并编译、运行一个Maven项目的操作就全部结束了
原文地址:https://www.cnblogs.com/noyitela/p/10386444.html