本指南旨在作为第一次使用 Maven 的人的参考,但也旨在作为一本包含自包含参考资料和常见用例解决方案的食谱。对于初次使用的用户,建议您按顺序逐步浏览材料。对于更熟悉 Maven 的用户,本指南致力于为手头的需求提供快速解决方案。此时假设您已经下载了 Maven 并在本地计算机上安装了 Maven。如果您还没有这样做,请参阅下载和安装说明。
好的,所以你现在已经安装了 Maven,我们准备好了。在开始我们的示例之前,我们将简要介绍一下 Maven 是什么以及它如何帮助您完成日常工作以及与团队成员的协作。当然,Maven 将适用于小型项目?,但 Maven 通过允许团队成员专注于项目的利益相关者的需求来帮助团队更有效地运作。您可以将构建基础架构留给 Maven!
Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理,是一个自动化构建工具。maven是Apache的顶级项目,解释为“专家,内行”,它是一个项目管理的工具,maven自身是纯java开发的( Theresult is a tool that can now be used for building and managing any Java-basedproject),可以使用maven对java项目进行构建、依赖管理。
————————————————
版权声明:本文为CSDN博主「Godsend knock code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_73778722/article/details/130750660
总结:Maven是一个跨平台的开源的项目管理工具,是一个主要用于Java项目信息和依赖管理的自动化构建工具。
关键词:项目管理、依赖管理、自动化构建工具!
Maven 可以通过采用标准约定和实践来加快您的开发周期,同时帮助您获得更高的成功率,从而为您的构建过程带来好处。
(翻译:标准约定、最佳实践、自动化构建 -> 开发高效?)
现在我们已经介绍了一些 Maven 的历史和目的,让我们进入一些真实的例子来帮助您开始使用 Maven!
1.管理jar包
(1)增加第三方jar包(不需要自己下载jar包)
(2)管理jar包之间的依赖关系(maven自动关联下载所有依赖的jar包)
2.将项目拆分成若干个模块:借助于Maven可以将一个项目拆分成多个工程。
————————————————
版权声明:本文为CSDN博主「Godsend knock code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_73778722/article/details/130750660
总结:
1、管理依赖(根据pom.xml文件,自动下载配置的Jar包及关联的Jar包);
2、项目多模块开发(根据pom.xml文件,配置父子模块工程)
Maven 的默认值通常就足够了,但如果您需要更改缓存位置或位于 HTTP 代理后面,则需要创建配置。有关更多信息,请参阅配置 Maven 指南。
为了创建最简单的 Maven 项目,请从命令行执行以下命令:
mvn -B archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
mvn -B archetype:generate -DgroupId=com.jcgx.mvn -DartifactId=my-first-mvn -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
-- 授人以鱼,不如授人以渔 !!!
mvn --help
-- 以批处理(batch)模式运行;
-B,--batch-mode Run in non-interactive (batch)
mode (disables output color)
-D,--define <arg> Define a system property
-h,--help Display help information
执行此命令后,您会注意到发生了一些事情。首先,您会注意到已为新项目创建了一个名为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.jcgx.mvngroupId>
<artifactId>my-first-mvnartifactId>
<version>1.0-SNAPSHOTversion>
<name>my-first-mvnname>
<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 本质上是以**项目(artifact 手工制品)**为中心的,因为一切都围绕着项目的概念。简而言之,POM 包含有关您的项目的所有重要信息,并且本质上是一站式购物,可以找到与您的项目相关的任何信息。了解 POM 很重要,鼓励新用户参考POM 简介。
这是一个非常简单的 POM,但仍然显示了每个 POM 包含的关键元素,因此让我们逐一介绍它们以熟悉 POM 的基本要素:
org.apache.maven.plugins
是为所有 Maven 插件指定的 groupId。myapp-1.0.jar
)。SNAPSHOT
在版本中看到指示符,这表明项目处于开发状态。我们将在本指南中讨论快照的使用以及它们如何进一步工作。有关可在 POM 中使用的元素的完整参考,请参阅我们的POM 参考。现在让我们回到手头的项目。
在您的第一个项目的原型生成之后,您还会注意到已创建以下目录结构:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
如您所见,从原型创建的项目有一个 POM、一个用于应用程序源代码的源代码树和一个用于测试源代码的源代码树。这是 Maven 项目的标准布局(应用程序源位于${basedir}/src/main/java
,测试源位于${basedir}/src/test/java
,其中 ${basedir} 表示包含 的目录pom.xml
)。
如果您要手动创建一个 Maven 项目,这是我们推荐使用的目录结构。这是一个 Maven 约定,要了解更多信息,您可以阅读我们的标准目录布局简介。
现在我们有了 POM、一些应用程序源和一些测试源,您可能会问…
切换到由 archetype:generate 创建 pom.xml 的目录,并执行以下命令来编译您的应用程序源:
mvn compile
执行此命令后,您应该会看到如下输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-first-mvn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-first-mvn ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-first-mvn ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.939 s
[INFO] Finished at: 2023-07-31T15:04:32+08:00
[INFO] Final Memory: 13M/134M
[INFO] ------------------------------------------------------------------------
第一次执行此(或任何其他)命令时,Maven 将需要下载执行该命令所需的所有插件和相关依赖项。从全新安装的 Maven 开始,这可能需要相当长的时间(在上面的输出中,大约需要 4 分钟)。如果您再次执行该命令,Maven 现在将拥有它需要的东西,因此它不需要下载任何新内容,并且能够更快地执行该命令。
执行以下命令:
mvn test
执行此命令后,您应该会看到如下输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-first-mvn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-first-mvn ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-first-mvn ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ my-first-mvn ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ my-first-mvn ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ my-first-mvn ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.jcgx.mvn.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 s - in com.jcgx.mvn.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.360 s
[INFO] Finished at: 2023-07-31T15:21:30+08:00
[INFO] Final Memory: 16M/163M
[INFO] ------------------------------------------------------------------------
关于输出的一些注意事项:
如果您只是想编译您的测试源(但不执行测试),您可以执行以下操作:
mvn test-compile
现在您可以编译您的应用程序源代码、编译您的测试并执行测试,您需要继续进行下一个合乎逻辑的步骤,所以您会问…
制作 JAR 文件非常简单,可以通过执行以下命令来完成:
mvn package
您现在可以查看${basedir}/target
目录,您将看到生成的 JAR 文件。
现在您需要在本地仓库中安装您生成的工件(JAR 文件)(${user.home}/.m2/repository
默认位置)。有关存储库的更多信息,您可以参考我们的仓库简介,但让我们继续安装我们的工件!为此,请执行以下命令:
mvn install
执行此命令后,您应该看到以下输出:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-first-mvn 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-first-mvn ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-first-mvn ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ my-first-mvn ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ my-first-mvn ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ my-first-mvn ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.jcgx.mvn.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 s - in com.jcgx.mvn.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ my-first-mvn ---
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ my-first-mvn ---
[INFO] Installing D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\target\my-first-mvn-1.0-SNAPSHOT.jar to D:\dev\apache-maven-3.5.2-bin\.m2\repository\com\jcgx\mvn\my-first-mvn\1.0-SNAPSHOT\my-first-mvn-1.0-SNAPSHOT.jar
[INFO] Installing D:\01-开发学习笔记\20230731-重学Maven\code\my-first-mvn\pom.xml to D:\dev\apache-maven-3.5.2-bin\.m2\repository\com\jcgx\mvn\my-first-mvn\1.0-SNAPSHOT\my-first-mvn-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.299 s
[INFO] Finished at: 2023-07-31T15:51:56+08:00
[INFO] Final Memory: 10M/94M
[INFO] ------------------------------------------------------------------------
请注意,surefire 插件(执行测试)会查找包含在具有特定命名约定的文件中的测试。默认情况下,包含的测试是:
**/*Test.java
**/Test*.java
**/*TestCase.java
默认排除是:
**/Abstract*Test.java
**/Abstract*TestCase.java
您已经完成了设置、构建、测试、打包和安装典型 Maven 项目的过程。这可能是绝大多数项目将使用 Maven 进行的操作,如果您已经注意到,到目前为止您所做的一切都是由一个 18 行文件驱动的,即项目的模型或 POM。如果您查看一个典型的 Ant构建文件,它提供了与我们迄今为止实现的功能相同的功能,您会注意到它已经是 POM 大小的两倍,而我们才刚刚开始!Maven 可以为您提供更多功能,而无需像当前那样对我们的 POM 进行任何添加。要从我们的示例 Ant 构建文件中获得更多功能,您必须不断进行容易出错的添加。
那么你还能免费获得什么?有很多 Maven 插件可以开箱即用,即使是像我们上面那样的简单 POM。我们将在这里特别提到一个,因为它是 Maven 最受重视的特性之一:无需您做任何工作,这个 POM 就有足够的信息来为您的项目生成一个网站!您很可能想要自定义您的 Maven 站点,但如果您时间紧迫,您只需执行以下命令即可提供有关项目的基本信息:
mvn site
还有许多其他独立的目标也可以执行,例如:
mvn clean
mvn clean install 组合命令,先清理再安装
这将在开始之前删除target
目录包含的所有构建数据,使其保持最新。
请注意,下面显示的文件中版本标记的值pom.xml
具有后缀:-SNAPSHOT
.
...
my-app
...
1.0-SNAPSHOT
Maven Quick Start Archetype
...
该SNAPSHOT
值是指开发分支中的“最新”代码,不保证代码是稳定的或不变的。相反,“发布”版本(任何不带后缀的版本值SNAPSHOT
)中的代码是不变的。
换句话说,SNAPSHOT 版本是最终“发布”版本之前的“开发”版本。SNAPSHOT 比它的版本“旧”。
在发布过程中, xy-SNAPSHOT的一个版本更改为xy。发布过程还将开发版本增加到x.(y+1)-SNAPSHOT。例如,版本1.0-SNAPSHOT发布为1.0版本,新的开发版本为1.1-SNAPSHOT版本。
为了让您开始使用 Maven 的文档系统,您可以使用原型机制使用以下命令为现有项目生成站点:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-site \
-DgroupId=com.mycompany.app \
-DartifactId=my-app-site
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site -DgroupId=com.jcgx.multi-module-mvn -DartifactId=my-app-site
现在转到创建站点指南,了解如何为您的项目创建文档。
请注意,生命周期适用于任何项目类型。例如,回到基本目录,我们可以创建一个简单的 Web 应用程序:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.jcgx.multi-module-mvn -DartifactId=my-webapp
请注意,这些都必须在一行上。这将创建一个名为my-webapp
的目录,其中包含以下项目描述符:
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.mycompany.appgroupId>
<artifactId>my-webappartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
dependencies>
<build>
<finalName>my-webappfinalName>
build>
project>
注意
元素 - 这告诉 Maven 构建为 WAR。切换到 webapp 项目的目录并尝试:
mvn package
您会看到target/my-webapp.war
构建完成,并且所有正常步骤都已执行。
处理多个模块的概念内置在 Maven 中。在本节中,我们将展示如何构建上面的 WAR,并在一个步骤中包含之前的 JAR。
首先,我们需要pom.xml
在另外两个上面的目录中添加一个父文件,所以它应该是这样的:
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
您将创建的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.mycompany.appgroupId>
<artifactId>appartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<modules>
<module>my-appmodule>
<module>my-webappmodule>
modules>
project>
我们需要来自 webapp 的 JAR 依赖项,因此将其添加到my-webapp/pom.xml
:
...
<dependencies>
<dependency>
<groupId>com.mycompany.appgroupId>
<artifactId>my-appartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
...
dependencies>
最后,将以下
元素添加到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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.mycompany.appgroupId>
<artifactId>appartifactId>
<version>1.0-SNAPSHOTversion>
parent>
...
现在,试一试…从顶级目录,运行:
mvn verify
现在已经在 中创建了 WAR my-webapp/target/my-webapp.war
,并且包含了 JAR:
$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
0 Fri Jun 24 10:59:56 EST 2005 META-INF/
222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/
3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/
215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml
123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties
52 Fri Jun 24 10:59:56 EST 2005 index.jsp
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/
2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar
这是如何运作的?首先,创建的父 POM(称为app
)具有pom
定义的模块的包装和列表。这告诉 Maven 在一组项目上运行所有操作,而不仅仅是当前一个(要覆盖此行为,您可以使用--non-recursive
命令行选项)。
接下来,我们告诉 WAR 它需要my-app
JAR。这做了一些事情:它使它在类路径上可用于 WAR 中的任何代码(在这种情况下没有),它确保 JAR 始终在 WAR 之前构建,并且它指示 WAR 插件将 JAR 包含在它的库目录。
您可能已经注意到这junit-4.11.jar
是一个依赖项,但最终并未出现在 WAR 中。原因是
元素 - 它仅用于测试,因此不包含在 Web 应用程序中,因为编译时依赖项my-app
是。
最后一步是包含父定义。这确保了 POM 始终可以被定位,即使项目是通过在存储库中查找而与其父项目分开分发的。