一、什么是Maven?
乍一看,Maven可能是许多东西,但简而言之,Maven.试图将模式应用于项目的构建基础架构,以便通过提供使用最佳实践的明确途径来提高理解力和生产力。Maven本质上是一个项目管理和理解工具,因此提供了一种帮助管理的方法:
- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
Maven可以通过采用标准约定和实践来加速开发周期,同时帮助您实现更高的成功率,从而为您的构建过程提供好处。
现在我们已经介绍了一点Maven的历史和用途,让我们进入一些真实的例子,让您开始使用Maven!
二、如何设置Maven?
Maven的默认值通常已经足够了,但如果您需要更改缓存位置或位于HTTP代理之后,则需要创建配置。有关详细信息,请参阅《配置Maven指南》。
三、如何开发我的第一个Maven项目?
我们将立即开始创建您的第一个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)。POM是Maven中的基本工作单元。这一点需要记住,因为Maven本质上是以项目为中心的,因为一切都围绕着项目的概念。简而言之,POM包含关于您的项目的每一条重要信息,本质上是查找与您的项目相关的任何内容的一站式购物。理解POM很重要,鼓励新用户参考POM简介。
这是一个非常简单的POM,但仍然显示每个POM包含的关键元素,因此让我们逐一浏览它们,以熟悉POM要点:
- project这是所有Maven pom.xml文件中的顶级元素。
- modelVersion此元素指示此POM正在使用的对象模型的版本。模型本身的版本很少更改,但它是强制性的,以确保在Maven开发人员认为有必要更改模型时使用的稳定性。
- groupId此元素指示创建项目的组织或组的唯一标识符。groupId是项目的关键标识符之一,通常基于组织的完全限定域名。例如,org.apache.maven.plugins是所有maven插件的指定groupId。
- artifactId该元素指示由该项目生成的主要工件的唯一基名称。项目的主要工件通常是JAR文件。次级工件(如源捆绑包)也使用artifactId作为其最终名称的一部分。Maven生成的典型工件的格式为<artifactId>-<version><扩展>(例如,myapp-1.0.jar)。
- version该元素指示项目生成的工件的版本。Maven在版本管理方面帮了很大的忙,您经常会在版本中看到SNAPSHOT指示符,这表示项目处于开发状态。我们将在本指南中讨论快照的使用以及它们如何进一步工作。
- name此元素指示用于项目的显示名称。这通常用于Maven生成的文档。
- url此元素指示可以在哪里找到项目的站点。这通常用于Maven生成的文档。
- properties此元素包含可在POM中的任何位置访问的值占位符。
- dependencies此元素的子元素列出依赖项。POM的基石。
- build该元素处理诸如声明项目的目录结构和管理插件之类的事情。
有关POM中可用元素的完整参考,请参阅我们的POM参考。现在让我们回到手头的项目。
在第一个项目的原型生成之后,您还将注意到已创建了以下目录结构:
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中。其中${product.basedir{表示包含pom.xml的目录)。
如果要手动创建Maven项目,这是我们建议使用的目录结构。这是一个Maven约定,要了解更多关于它的信息,您可以阅读我们的标准目录布局简介。
现在我们有了一个POM、一些应用程序源和一些您可能会问的测试源。。。
四、如何编译应用程序?
切换到archetype创建pom.xml的目录:生成并执行以下命令以编译应用程序源:
mvn compile
在执行该命令时,您应该看到如下输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mycompany.app:my-app >----------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory <dir>/my-app/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to <dir>/my-app/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.899 s
[INFO] Finished at: 2020-07-12T11:31:54+01:00
[INFO] ------------------------------------------------------------------------
第一次执行这个(或任何其他)命令时,Maven将需要下载完成该命令所需的所有插件和相关依赖项。从干净的Maven安装中,这可能需要相当长的时间(在上面的输出中,几乎需要4分钟)。如果再次执行该命令,Maven现在将拥有它所需的内容,因此它不需要下载任何新的内容,并且能够更快地执行该命令。
从输出中可以看到,编译的类放在${project.basedir}/target/classes中,这是Maven采用的另一个标准约定。因此,如果您是一个敏锐的观察者,您会注意到,通过使用标准约定,上面的POM非常小,并且您不必明确地告诉Maven您的任何源代码在哪里,或者输出应该去哪里。通过遵循标准的Maven约定,您可以轻而易举地完成许多事情!作为一个偶然的比较,让我们看看您在Ant中可能必须做些什么才能完成相同的事情。
现在,这只是编译一棵应用程序源树,所示的Ant脚本的大小与上面显示的POM几乎相同。但我们将看到,我们可以做更多的只是简单的POM!
五、如何编译测试源并运行单元测试?
现在您成功地编译了应用程序的源代码,现在您有了一些要编译和执行的单元测试(因为每个程序员总是编写和执行他们的单元测试*微调微调微调*)。
执行以下命令:
mvn test
在执行该命令时,您应该看到如下输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mycompany.app:my-app >----------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory <dir>/my-app/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ my-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory <dir>/my-app/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to <dir>/my-app/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ my-app ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.mycompany.app.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s - in com.mycompany.app.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.881 s
[INFO] Finished at: 2020-07-12T12:00:33+01:00
[INFO] ------------------------------------------------------------------------
关于输出需要注意的一些事项:
- 这次Maven下载了更多的依赖项。这些是执行测试所必需的依赖项和插件(它已经具有编译所需的依赖项,并且不会再次下载它们)。
- 在编译和执行测试之前,Maven编译主代码(所有这些类都是最新的,因为自上次编译以来,我们没有更改任何内容)。
如果只想编译测试源(但不执行测试),则可以执行以下操作:
mvn test-compile
既然您可以编译应用程序源、编译测试和执行测试,那么您需要继续下一个逻辑步骤,这样您就会问。。。