Maven
Maven Getting Started Guide
- 本指南旨在作为第一次使用Maven的人的参考,但也旨在作为一本食谱,为常见用例提供独立的参考和解决方案。对于第一次使用的用户,建议您按顺序逐步浏览材料。对于更熟悉Maven的用户,本指南致力于为手头的需求提供快速解决方案。在这一点上,假设您已经下载了Maven并在本地机器上安装了Maven。如果您还没有这样做,请参阅Downloading Apache Maven和Installing Apache Maven说明。
- 好的,现在您已经安装了Maven,我们可以开始了。在我们进入示例之前,我们将非常简要地介绍什么是Maven,以及它如何帮助您进行日常工作以及与团队成员的协作。当然,Maven将为小型项目工作,但Maven通过允许团队成员专注于项目利益相关者的需求,在帮助团队更有效地运作方面大放异彩。您可以将构建基础设施留给Maven!
What is Maven?
-
乍一看,Maven可能有很多东西,但简而言之,Maven是一种将模式应用于项目的构建基础设施的尝试,目的是通过提供使用最佳实践的清晰路径来提高理解力和生产力。Maven本质上是一个项目管理和理解工具,因此提供了一种帮助管理的方法:
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
-
如果你想了解更多关于Maven的背景信息,你可以查看[The Philosophy of Maven](#The Philosophy of Maven)和[The History of Maven](# history-of-maven)。现在,让我们继续讨论用户如何从使用Maven中获益。
How can Maven benefit my development process?
-
Maven可以通过采用标准约定和实践来加快开发周期,同时帮助您获得更高的成功率,从而为您的构建过程带来好处。
-
现在我们已经介绍了Maven的一些历史和目的,让我们进入一些真实的例子,让您开始使用Maven!
How do I setup Maven?
- Maven的默认值通常足够了,但如果您需要更改缓存位置或位于HTTP代理之后,则需要创建配置。有关更多信息,请参阅[Guide to Configuring Maven](# Guide to Configuring Maven)。
How do I make my first Maven project?
-
我们将立即创建您的第一个Maven项目!为了创建我们的第一个Maven项目,我们将使用Maven的原型机制。原型被定义为一种原始的模式或模型,所有其他同类事物都是从这种模式或模型中产生的。在Maven中,原型是一个项目的模板,它与一些用户输入相结合,生成一个可工作的Maven项目,该项目已根据用户的需求进行了定制。我们现在将向您展示原型机制是如何工作的,但如果您想了解更多关于原型的信息,请参阅我们的原型介绍。
-
开始创建您的第一个项目!为了创建最简单的Maven项目,请从命令行执行以下操作:
mvn -B archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
-
一旦您执行了这个命令,您就会注意到发生了一些事情。首先,您会注意到,已经为新项目创建了一个名为my-app的目录,该目录包含一个名称为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> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <name>my-app</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <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.11</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> ... lots of helpful plugins </pluginManagement> </build> </project>
-
pom.xml包含此项目的项目对象模型(pom Project Object Model )。POM是Maven中的基本工作单元。记住这一点很重要,因为Maven本质上是以项目为中心的,因为一切都围绕着项目的概念。简言之,POM包含了关于您的项目的每一条重要信息,本质上是一站式购物,用于查找与您的项目相关的任何信息。了解POM非常重要,鼓励新用户参考[Introduction to the POM](#Introduction to the POM)。
-
这是一个非常简单的POM,但仍然显示了每个POM包含的关键元素,所以让我们来浏览它们中的每一个,以熟悉POM的要点:
- project 这是所有Maven
pom.xml
文件中的顶级元素。 - modelVersion 这个元素指示这个POM使用的对象模型的版本。模型本身的版本很少更改,但当Maven开发人员认为有必要更改模型时,为了确保使用的稳定性,它是强制性的。
- groupId 此元素表示创建项目的组织或组的唯一标识符。groupId是项目的关键标识符之一,通常基于组织的完全限定域名。 例如
org.apache.maven.plugins
是所有maven插件的指定groupId。 - artifactId 此元素表示此项目生成的主要工件的唯一基本名称。项目的主要工件通常是一个JAR文件。像源bundle这样的次要工件也使用artifactId作为其最终名称的一部分。Maven生成的典型工件的形式为
- . (例如, myapp-1.0.jar
). - version 这个元素表示项目生成的工件的版本。Maven在很大程度上帮助您进行版本管理,您经常会在版本中看到
SNAPSHOT
指示符,这表明项目处于开发状态。我们将在本指南中进一步讨论snapshots的使用及其工作方式。 - name 此元素指示用于项目的显示名称。这在Maven生成的文档中经常使用。
- url 此元素指示可以在哪里找到项目的网站。这在Maven生成的文档中经常使用。
- properties 此元素包含可在POM中的任何位置访问的值占位符。
- dependencies 此元素的子项列出dependencies。POM的基石。
- build 这个元素处理诸如声明项目的目录结构和管理插件之类的事情。
- project 这是所有Maven
-
有关POM中可使用的元素的完整参考,请参阅我们的[POM Reference](# POM Reference)。现在让我们回到手头的项目上来。
-
在第一个项目的原型生成之后,您还会注意到已经创建了以下目录结构:
my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- mycompany | `-- app | `-- App.java `-- test `-- java `-- com `-- mycompany `-- app `-- AppTest.java
-
正如您所看到的,从原型创建的项目有一个POM,一个用于应用程序源代码的源代码树和一个用于测试源代码的代码树。这是Maven项目的标准布局(应用程序源位于${project.basedir}/src/main/java中,测试源位于${project.basedir}/src/test/java中,其中${project.basedir}表示包含pom.xml的目录)。
-
如果您要手动创建Maven项目,这是我们建议使用的目录结构。这是一个Maven约定,要了解更多信息,您可以阅读我们的[Introduction to the Standard Directory Layout](# Introduction to the Standard Directory Layout).
-
现在我们有了POM、一些应用程序源和一些测试源,您可能会问...
How do I compile my application sources?
-
更改到原型创建
pom.xml
的目录:生成并执行以下命令以编译应用程序源:mvn compile
The Philosophy of Maven
The History of Maven
- Maven通常被许多人认为是一种构建工具。许多最初来到Maven的人都熟悉Ant,所以这是一个自然的联想,但Maven不仅仅是一个构建工具,也不仅仅是Ant的替代品。Maven和Ant是完全不同的生物。Ant只是一个工具箱,而Maven则是关于模式的应用,以实现一个显示可见性、可重用性、可维护性和可理解性特征的基础设施。
- 如果没有这些特征,多个人在一个项目上进行富有成效的合作是极不可能的。如果没有可见性,一个人不太可能知道另一个人完成了什么,因此很有可能有用的代码不会被重用。当代码不被重用时,很难创建一个可维护的系统。当每个人都在不断地寻找组成你的项目的所有这些不同的部分时,几乎没有人会理解整个项目。结果,你最终会出现筒仓效应,即共享知识的衰退,以及团队成员之间相应程度的挫败感。当流程不以相同的方式对每个人起作用时,这是一种自然的效果。
- Maven诞生于一种非常实际的愿望,即让Apache的几个项目以同样的方式工作。这样,开发人员就可以在这些项目之间自由移动,通过了解其中一个项目的工作原理,清楚地了解它们是如何工作的。如果开发人员花时间了解一个项目是如何构建的,那么他们在进入下一个项目时就不必再经历这个过程了。同样的想法扩展到测试、生成文档、生成度量和报告、测试和部署。所有项目都有足够多的相同特征,Maven试图在其项目管理的一般方法中利用这一点。在非常高的级别上,所有项目都需要构建、测试、打包、记录和部署。当然,上述每个步骤都有无限的变化,但这种变化仍然发生在一个定义良好的路径的范围内,Maven试图以一种清晰的方式向每个人展示这条路径。明确路径的最简单方法是为人们提供一组模式,参与项目的任何人都可以共享这些模式。