Maven 使用教程

一、什么是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

既然您可以编译应用程序源、编译测试和执行测试,那么您需要继续下一个逻辑步骤,这样您就会问。。。

相关推荐
kinlon.liu12 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓33 分钟前
Linux通过yum安装Docker
java·linux·docker
java66666888837 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存38 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯39 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
严文文-Chris2 小时前
【设计模式-享元】
android·java·设计模式