![轻量级Java EE企业应用开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/980/44509980/b_44509980.jpg)
2.1 Maven概述
Maven是Apache基金会下的一个子项目,意为“知识的积累者”,旨在用一种标准的方式来构建项目,明确定义项目的组成部分,通过一种简便的方法来发布项目信息,以及实现在多个项目中共享JAR。
Maven可以用于构建和管理任何基于Java项目的工具,可以使Java开发人员的日常工作更加轻松,并且通常有助于理解任何基于Java的项目。
与Maven类似的工具有Ant、Gradle等。
2.1.1 Maven的主要功能
Maven的主要目标是允许开发人员在最短的时间内理解开发工作的完整状态。为了实现此目标,Maven尝试解决以下几个方面的问题:
1.简化构建过程
虽然使用Maven并不能消除对底层机制的了解,但Maven确实为细节提供了很多保护。
2.提供统一的构建系统
Maven允许项目使用其项目对象模型进行构建,并且使用Maven的所有项目共享一组插件,从而提供统一的构建系统。一旦熟悉了一个Maven项目的构建方式,就会自动知道所有Maven项目的构建方式,从而在尝试浏览多个项目时节省大量时间。
3.提供优质的项目信息
Maven提供了大量有用的项目信息,这些信息部分是从POM中获取的,部分是从项目的来源中生成的。例如,Maven可以提供:
- 更改直接从源代码管理创建的日志文档。
- 交叉引用来源。
- 项目管理的邮件列表清单。
- 依赖清单。
- 单元测试报告,包括覆盖率。
随着Maven的改进,所提供的信息集将得到改善,所有这些信息对Maven的用户都是透明的。
其他产品还可以提供Maven插件,以允许其项目信息集以及Maven给出一些标准信息,而这些信息仍然基于POM。
4.提供最佳实践开发指南
Maven的目的是收集当前最佳实践开发的原则,并使其易于朝着这个方向指导项目。
例如,单元测试的规范、执行和报告是使用Maven的常规构建周期的一部分。当前的单元测试较佳实践被用作准则:
- 将测试源代码保存在单独但并行的源树中。
- 使用测试用例命名约定来定位和执行测试。
- 让测试用例设置其环境,而不是依赖于自定义构建以进行测试准备。
Maven旨在协助项目工作流程,例如发布和问题管理。
Maven还建议了一些有关如何布局项目目录结构的准则。了解布局之后,就可以轻松导航使用Maven和相同默认值的任何其他项目。
5.允许透明迁移到新功能
Maven为Maven客户端提供了一种轻松的方式来更新其安装,以便可以利用对Maven本身所做的任何更改。
因此,从第三方或Maven本身安装新的或更新的插件变得很简单。
2.1.2 创建Maven项目
在工作目录中执行以下命令,即可创建一个Maven项目:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P46_78770.jpg?sign=1739290902-M7PDBNOQ8uKqszgQpikR9DpfEwuTuJOV-0-07e7d93b61fccc927d5227ead3588b4c)
上述命令含义如下:
- archetype:generate用于创建工程架构的原型。
- groupId指定了新建项目的工程名。
- artifactId指定了创建的项目名称。
- archetypeArtifactId指定了创建工程架构的原型的名称。
- archetypeVersion指定了创建工程架构的原型的版本。
- interactiveMode设置了交互模式。
看到如下控制台输出的内容,说明已经执行成功了:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P47_78771.jpg?sign=1739290902-7g4gQ6JFt8NzVJgQ43yXmZEr0UCqOket-0-4f6f830a986e63e5d50b935bcb782376)
在工作目录下可以看到一个hello-world文件夹,该文件夹就是我们刚刚创建的Maven项目。
2.1.3 探索Maven项目
新建的hello-world项目结构如下:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P48_78773.jpg?sign=1739290902-9FHR8fNwHn1dRm9G67rO1w5TPrzO5NzF-0-14af0d8bfbbe979124a7d37bcde0f078)
hello-world项目根目录下是一个名为pom.xml的POM文件。
hello-world项目根目录下的src是指项目的源码。源码包括两部分,main目录下就是平时开发的功能代码;而test目录下则用于放置测试代码。至于为什么Maven使用这些目录,可以看后续2.3节的内容。
1.pom.xml
pom.xml的内容如下:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P49_78774.jpg?sign=1739290902-fEnoddf3iee5Wvl0fjq2E1xJwHPZvVnN-0-55bf8d1c9bd575722f9b90005508733c)
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P50_78775.jpg?sign=1739290902-UdrWX7BTHrHFGYmwR3mkGyjX2qeLPAPJ-0-122f37a1ef58ac4217ace5bea02fa4b5)
上述文件中:
- <groupId>和<artifactId>的含义与mvn archetype:generate中的参数groupId和artifactId的含义相同。
- <properties>用于配置项目的属性。
- <dependencies>用于配置项目的依赖。
- <pluginManagement>用于项目的插件管理。
有关POM的内容会在2.3节详细讲解。
2.App.java
App.java是项目的业务功能代码,内容如下:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P50_78776.jpg?sign=1739290902-eQonxENTbDxckWsCjuz9k3LckajRxtPa-0-dfb637d59bc5f5999a29004c0c1dbdb0)
上述业务较为简单,运行程序后,会打印“Hello World!”字样的内容。
3.AppTest.java
AppTest.java是测试用例代码,内容如下:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P51_78778.jpg?sign=1739290902-v0IBOvwGs2Yaq6tGKIWvAIuqUlG38TkU-0-8bd65b16033f3df2f4aa220cf3c36b08)
上述测试较为简单,运行测试用例后,assertTrue方法会判断输入变量是否为true。
2.1.4 构建Maven项目
执行“mvn package”命令来构建Maven项目,命令行将打印出各种操作,并以以下内容结束:
![](https://epubservercos.yuewen.com/A99FE4/23721413109387006/epubprivate/OEBPS/Images/Figure-P51_78779.jpg?sign=1739290902-6JeArH7TNcslnUkPFF0H29vEeCYbJ7u9-0-991ba24aa7072bbed5d8675a02935052)
命令中的“package”是Maven中的一个阶段。阶段是构建Maven生命周期中的一个步骤。当给出一个阶段时,Maven将执行指定阶段之前的所有阶段。例如,如果我们执行compile阶段,那么实际执行的阶段为:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
有关Maven阶段的内容将在后续章节中介绍。
通过上述命令会在项目的target目录下生成一个新编译和打包的JAR文件。可以使用以下命令测试该JAR文件:
java -cp target/hello-world-1.0-SNAPSHOT.jar com.waylau.java.App
控制台输出如下:
Hello World!