Maven是什么?
Maven, a Yiddish word meaning accumulator of knowledge, began as an attempt to simplify the build processes in the Jakarta Turbine project. There were several projects, each with their own Ant build files, that were all slightly different. JARs were checked into CVS. We wanted a standard way to build the projects, a clear definition of what the project consisted of, an easy way to publish project information, and a way to share JARs across several projects.
Maven,一个 Yiddish 词语 意味着知识的积累者,开始是在 Jakarta Turbine 项目中简化 构建过程的尝试、 有很多项目。都有自己的 Ant 构建文件。都有一些不同,Jars were checked into CVS. 我们需要一种构建项目的标准方法、项目组成的清晰定义、发布项目信息的简单方法以及跨多个项目共享 JAR 的方法。
The result is a tool that can now be used for building and managing any Java-based project. We hope that we have created something that will make the day-to-day work of Java developers easier and generally help with the comprehension of any Java-based project
结果是一个现在可用于构建和管理任何基于 Java 的项目的工具。我们希望我们所创建的东西能够使 Java 开发人员的日常工作变得更加轻松,并且通常有助于理解任何基于 Java 的项目。
上面是官方对于Maven是什么的一个解释,简单理解就是为了去简化构建过程的一个工具,暂且这样理解吧。
Maven 能解决什么问题?
Maven的主要目标是让开发人员在最短的时间内理解开发工作的完整状态。为了实现这一目标,Maven处理若干相关领域:
1、让构建的过程更容易
虽然使用 Maven 并不能消除了解底层机制的需要,但 Maven 确实使开发人员免于了解许多细节。
2、提供统一的构建体系
Maven 使用其项目对象模型 (POM) 和一组插件来构建项目。一旦熟悉了一个 Maven 项目,您就知道所有 Maven 项目是如何构建的。这可以节省浏览多个项目的时间
3、提供优质的项目信息
Maven 提供有用的项目信息,这些信息部分取自 POM,部分从项目源生成。例如,Maven可以提供:
● 直接从源代码管理创建的更改日志
● 交叉引用来源
● 由项目管理的邮件列表
● 项目使用的依赖项
● 包括覆盖率的单元测试报告
4、鼓励更好的开发实践
Maven 旨在收集最佳实践开发的当前原则,并轻松引导项目朝该方向发展。例如,单元测试的规范、执行和报告是使用 Maven 的正常构建周期的一部分。当前的单元测试最佳实践被用作指导方针:
● 将测试源代码保存在单独但并行的源代码树中
● 使用测试用例命名约定来定位和执行测试
● 让测试用例设置其环境,而不是定制测试准备的构建
Maven 还建议了一些关于如何布局项目目录结构的指南。一旦了解了布局,您就可以轻松导航使用 Maven 的其他项目.
虽然 Maven 对项目布局采取了固执己见的方法,但由于历史原因,某些项目可能不适合这种结构。虽然 Maven 被设计为能够灵活地满足不同项目的需求,但它无法在不影响其目标的情况下满足所有情况。
如果您的项目具有无法重组的不寻常构建结构,您可能必须放弃某些功能或完全放弃 Maven 的使用。
我们如何使用Maven?
1、下载
2、使用
Maven 是一个Java 工具,因此必须先安装JDK才可以继续。
针对于windows:
进入cmd 界面, 查看maven版本
mvn --version
显示信息 如下 (只是一个案例,具体版本是自己安装的版本):
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: D:\apache-maven-3.6.3\apache-maven\bin\..
Java version: 1.8.0_232, vendor: AdoptOpenJDK, runtime: C:\Program Files\AdoptOpenJDK\jdk-8.0.232.09-hotspot\jre
Default locale: en_US, platform encoding: Cp1250
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
3、创建一个项目
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
4、进入项目
cd my-app
5、目录结构
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
6、pom.xml 文件
pom.xml 文件是 Maven 中项目配置的核心。它是一个单一的配置文件,包含按照您想要的方式构建项目所需的大部分信息。POM 非常庞大,其复杂性令人望而生畏,但没有必要了解所有复杂性才能有效地使用它。该项目的POM是:
<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.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
7、Maven 阶段
虽然这不是一个完整的列表,但这些是执行的最常见的默认生命周期阶段。
validate :验证项目是否正确并且所有必要的信息均可用
compile : 编译项目的源代码
test : 使用合适的单元测试框架测试编译的源代码。这些测试不应要求打包或部署代码
package : 获取编译后的代码并将其打包为其可分发的格式,例如 JAR。
integration-test : 如有必要,处理包并将其部署到可以运行集成测试的环境中
verify : 进行任何检查以验证包是否有效并符合质量标准
install : 将包安装到本地存储库中,以用作本地其他项目的依赖项
deploy : 在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享。
除了上面的默认列表之外,还有另外两个值得注意的 Maven 生命周期。他们是:
clean : 清理先前构建创建的工件
site: 生成该项目的站点文档
8、Maven安装目录 settings.xml 更换换阿里云仓库地址(加速访问)
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>