乍一看,Maven可能是许多东西,但简而言之,Maven.试图将模式应用于项目的构建基础架构,以便通过提供使用最佳实践的明确途径来提高理解力和生产力。Maven本质上是一个项目管理和理解工具,因此提供了一种帮助管理的方法:
Maven可以通过采用标准约定和实践来加速开发周期,同时帮助您实现更高的成功率,从而为您的构建过程提供好处。
现在我们已经介绍了一点Maven的历史和用途,让我们进入一些真实的例子,让您开始使用Maven!
Maven的默认值通常已经足够了,但如果您需要更改缓存位置或位于HTTP代理之后,则需要创建配置。有关详细信息,请参阅《配置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.0modelVersion>
-
- <groupId>com.mycompany.appgroupId>
- <artifactId>my-appartifactId>
- <version>1.0-SNAPSHOTversion>
-
- <name>my-appname>
-
- <url>http://www.example.comurl>
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.7maven.compiler.source>
- <maven.compiler.target>1.7maven.compiler.target>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.11version>
- <scope>testscope>
- dependency>
- dependencies>
-
- <build>
- <pluginManagement>
- ... lots of helpful plugins
- pluginManagement>
- build>
- project>
pom.xml包含此项目的项目对象模型(pom)。POM是Maven中的基本工作单元。这一点需要记住,因为Maven本质上是以项目为中心的,因为一切都围绕着项目的概念。简而言之,POM包含关于您的项目的每一条重要信息,本质上是查找与您的项目相关的任何内容的一站式购物。理解POM很重要,鼓励新用户参考POM简介。
这是一个非常简单的POM,但仍然显示每个POM包含的关键元素,因此让我们逐一浏览它们,以熟悉POM要点:
有关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] ------------------------------------------------------------------------
关于输出需要注意的一些事项:
如果只想编译测试源(但不执行测试),则可以执行以下操作:
mvn test-compile
既然您可以编译应用程序源、编译测试和执行测试,那么您需要继续下一个逻辑步骤,这样您就会问。。。