• Maven 使用教程(三)


    一、如何使用外部依赖项?

    您可能已经注意到POM中的一个dependencies元素,我们一直在使用它作为示例。事实上,您一直在使用外部依赖项,但在这里我们将更详细地讨论它是如何工作的。有关更全面的介绍,请参阅我们的依赖机制介绍。
    pom.xml的依赖项部分列出了我们的项目构建所需的所有外部依赖项(无论是在编译时、测试时、运行时还是其他时候)。现在,我们的项目只依赖于JUnit(为了清晰起见,我去掉了所有的资源过滤内容):

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0</modelVersion>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. <packaging>jar</packaging>
    8. <name>Maven Quick Start Archetype</name>
    9. <url>http://maven.apache.org</url>
    10. <dependencies>
    11. <dependency>
    12. <groupId>junit</groupId>
    13. <artifactId>junit</artifactId>
    14. <version>4.11</version>
    15. <scope>test</scope>
    16. </dependency>
    17. </dependencies>
    18. </project>

    对于每个外部依赖,您至少需要定义4个内容:groupId、artifactId、version和scope。groupId、artifactId和version与构建该依赖关系的项目的pom.xml中给出的相同。scope元素指示项目如何使用该依赖项,可以是编译、测试和运行时等值。有关可以为依赖项指定的所有内容的详细信息,请参阅项目描述符参考。
    有关整个依赖机制的更多信息,请参阅依赖机制简介。
    有了这些关于依赖项的信息,Maven将能够在构建项目时引用该依赖项。Maven从哪里引用依赖项?Maven在本地存储库中查找所有依赖项(默认位置为${user.home}/.m2/存储库)。在上一节中,我们将项目中的工件(my-app-1.0-SNAPSHOT.jar)安装到本地存储库中。一旦它安装在那里,另一个项目可以将该jar作为依赖项引用,只需将依赖项信息添加到其pom.xml即可:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <groupId>com.mycompany.app</groupId>
    4. <artifactId>my-other-app</artifactId>
    5. ...
    6. <dependencies>
    7. ...
    8. <dependency>
    9. <groupId>com.mycompany.app</groupId>
    10. <artifactId>my-app</artifactId>
    11. <version>1.0-SNAPSHOT</version>
    12. <scope>compile</scope>
    13. </dependency>
    14. </dependencies>
    15. </project>

    在其他地方建立的依赖关系呢?它们是如何进入我的本地存储库的?每当项目引用本地存储库中不可用的依赖项时,Maven都会将该依赖项从远程存储库下载到本地存储库。当你构建第一个项目时,你可能注意到Maven下载了很多东西(这些下载是用于构建项目的各种插件的依赖项)。默认情况下,Maven使用的远程存储库可以在https://repo.maven.apache.org/maven2/.您还可以设置自己的远程存储库(可能是公司的中央存储库)来代替默认远程存储库或在默认远程存储库外使用。有关存储库的更多信息,请参阅存储库简介。

    让我们为我们的项目添加另一个依赖项。假设我们已经在代码中添加了一些日志记录,并且需要添加log4j作为依赖项。首先,我们需要知道log4j的groupId、artifactId和版本是什么。Maven Central上相应的目录名为/maven2/log4j/log4j。该目录中有一个名为maven-metadata.xml的文件。下面是log4j的maven-matadata.xml的样子:

    1. <metadata>
    2. <groupId>log4j</groupId>
    3. <artifactId>log4j</artifactId>
    4. <version>1.1.3</version>
    5. <versioning>
    6. <versions>
    7. <version>1.1.3</version>
    8. <version>1.2.4</version>
    9. <version>1.2.5</version>
    10. <version>1.2.6</version>
    11. <version>1.2.7</version>
    12. <version>1.2.8</version>
    13. <version>1.2.11</version>
    14. <version>1.2.9</version>
    15. <version>1.2.12</version>
    16. </versions>
    17. </versioning>
    18. </metadata>

    从这个文件中,我们可以看到我们想要的groupId是“log4j”,artifactId是“log4j”。我们看到许多不同的版本值可供选择;现在,我们只使用最新版本1.2.12(一些maven-metadata.xml文件可能还指定哪个版本是当前发布版本:请参阅存储库元数据参考)。除了maven-metadata.xml文件,我们还可以看到与log4j库的每个版本相对应的目录。在每一个文件中,我们都会找到实际的jar文件(例如log4j-1.2.12.jar)、pom文件(这是依赖项的pom.xml,指示它可能具有的任何其他依赖项和其他信息)和另一个maven-metadata.xml文件。还有一个对应于这些文件的md5文件,其中包含这些文件的md5哈希。您可以使用它来验证库,或者确定您可能已经在使用特定库的哪个版本。
    现在我们知道了我们需要的信息,我们可以将依赖项添加到pom.xml中:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0</modelVersion>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. <packaging>jar</packaging>
    8. <name>Maven Quick Start Archetype</name>
    9. <url>http://maven.apache.org</url>
    10. <dependencies>
    11. <dependency>
    12. <groupId>junit</groupId>
    13. <artifactId>junit</artifactId>
    14. <version>4.11</version>
    15. <scope>test</scope>
    16. </dependency>
    17. <dependency>
    18. <groupId>log4j</groupId>
    19. <artifactId>log4j</artifactId>
    20. <version>1.2.12</version>
    21. <scope>compile</scope>
    22. </dependency>
    23. </dependencies>
    24. </project>

    现在,当我们编译项目(mvn-compile)时,我们将看到Maven为我们下载log4j依赖项。

    二、如何在远程存储库中部署jar?

    为了将jar部署到外部存储库,您必须在pom.xml中配置存储库url,并在settings.xml中配置用于连接到存储库的身份验证信息。
    下面是一个使用scp和用户名/密码身份验证的示例:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0</modelVersion>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. <packaging>jar</packaging>
    8. <name>Maven Quick Start Archetype</name>
    9. <url>http://maven.apache.org</url>
    10. <dependencies>
    11. <dependency>
    12. <groupId>junit</groupId>
    13. <artifactId>junit</artifactId>
    14. <version>4.11</version>
    15. <scope>test</scope>
    16. </dependency>
    17. <dependency>
    18. <groupId>org.apache.codehaus.plexus</groupId>
    19. <artifactId>plexus-utils</artifactId>
    20. <version>1.0.4</version>
    21. </dependency>
    22. </dependencies>
    23. <build>
    24. <filters>
    25. <filter>src/main/filters/filters.properties</filter>
    26. </filters>
    27. <resources>
    28. <resource>
    29. <directory>src/main/resources</directory>
    30. <filtering>true</filtering>
    31. </resource>
    32. </resources>
    33. </build>
    34. <!--
    35. |
    36. |
    37. |
    38. -->
    39. <distributionManagement>
    40. <repository>
    41. <id>mycompany-repository</id>
    42. <name>MyCompany Repository</name>
    43. <url>scp://repository.mycompany.com/repository/maven2</url>
    44. </repository>
    45. </distributionManagement>
    46. </project>
    1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    3. ...
    4. <servers>
    5. <server>
    6. <id>mycompany-repository</id>
    7. <username>jvanzyl</username>
    8. <!-- Default value is ~/.ssh/id_dsa -->
    9. <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
    10. <passphrase>my_key_passphrase</passphrase>
    11. </server>
    12. </servers>
    13. ...
    14. </settings>

    请注意,如果您连接到的openssh-ssh服务器的sshd_config中的参数“PasswordAuthentication”设置为“no”,则每次都必须键入密码进行用户名/密码身份验证(尽管您可以通过键入用户名和密码使用另一个ssh客户端登录)。在这种情况下,您可能希望切换到公钥身份验证。
    如果在settings.xml中使用密码,应格外小心。

    三、如何创建文档?

    要开始使用Maven的文档系统,可以使用原型机制,使用以下命令为现有项目生成站点:

    1. mvn archetype:generate \
    2. -DarchetypeGroupId=org.apache.maven.archetypes \
    3. -DarchetypeArtifactId=maven-archetype-site \
    4. -DgroupId=com.mycompany.app \
    5. -DartifactId=my-app-site

    现在转到创建网站指南,了解如何为您的项目创建文档。

    四、如何构建其他类型的项目?

    请注意,生命周期适用于任何项目类型。例如,在基本目录中,我们可以创建一个简单的web应用程序:

    1. mvn archetype:generate \
    2. -DarchetypeGroupId=org.apache.maven.archetypes \
    3. -DarchetypeArtifactId=maven-archetype-webapp \
    4. -DgroupId=com.mycompany.app \
    5. -DartifactId=my-webapp

    请注意,这些必须都在一行上。这将创建一个名为my-webapp的目录,其中包含以下项目描述符:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0</modelVersion>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-webapp</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. <packaging>war</packaging>
    8. <dependencies>
    9. <dependency>
    10. <groupId>junit</groupId>
    11. <artifactId>junit</artifactId>
    12. <version>4.11</version>
    13. <scope>test</scope>
    14. </dependency>
    15. </dependencies>
    16. <build>
    17. <finalName>my-webapp</finalName>
    18. </build>
    19. </project>

    请注意<packaging>元素-这个元素告诉Maven构建为一个WAR。更改到Web应用程序项目的目录并尝试:

    mvn package
    

    您将看到target/my-webapp.war已经构建,并且所有正常步骤都已执行。

    五、如何一次构建多个项目?

    Maven内置了处理多个模块的概念。在本节中,我们将展示如何构建上面的WAR,并在一个步骤中包括前面的JAR。
    首先,我们需要在其他两个文件之上的目录中添加一个父pom.xml文件,因此它应该如下所示:

    1. +- pom.xml
    2. +- my-app
    3. | +- pom.xml
    4. | +- src
    5. | +- main
    6. | +- java
    7. +- my-webapp
    8. | +- pom.xml
    9. | +- src
    10. | +- main
    11. | +- webapp

    您将创建的POM文件应该包含以下内容:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0</modelVersion>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. <packaging>pom</packaging>
    8. <modules>
    9. <module>my-app</module>
    10. <module>my-webapp</module>
    11. </modules>
    12. </project>

    我们需要依赖于webapp中的JAR,所以将其添加到我的webapp/pom.xml中:

    1. ...
    2. <dependencies>
    3. <dependency>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>my-app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. </dependency>
    8. ...
    9. </dependencies>

    最后,将以下<parent>元素添加到子目录中的两个其他pom.xml文件中:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <parent>
    4. <groupId>com.mycompany.app</groupId>
    5. <artifactId>app</artifactId>
    6. <version>1.0-SNAPSHOT</version>
    7. </parent>
    8. ...

    现在,请尝试…从顶级目录运行:

    mvn verify
    

    WAR现在已经在我的webapp/target/my-webapp.WAR中创建,JAR包括在内:

    1. $ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
    2. 0 Fri Jun 24 10:59:56 EST 2005 META-INF/
    3. 222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF
    4. 0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/
    5. 0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/
    6. 0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/
    7. 3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml
    8. 0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/
    9. 215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml
    10. 123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties
    11. 52 Fri Jun 24 10:59:56 EST 2005 index.jsp
    12. 0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/
    13. 2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar

    这是怎么回事?首先,创建的父POM(称为应用程序)具有POM的封装和定义的模块列表。这个命令告诉Maven在一组项目上运行所有操作,而不是仅在当前项目上运行(要覆盖这种行为,可以使用--non-recurve命令行选项)。
    接下来,我们告诉WAR它需要my-appJAR。这做了几件事:它使它在类路径上对WAR中的任何代码都可用(在这种情况下没有),它确保JAR总是在WAR之前构建,并且它指示WAR插件将JAR包括在其库目录中。
    您可能已经注意到junit4.11.jar是一个依赖项,但最终并没有出现在WAR中。原因是test元素-它只是测试所必需的,因此不包括在web应用程序中,因为我的应用程序是编译时依赖项。
    最后一步是包含父定义。这确保了POM始终可以定位,即使项目是通过在存储库中查找与其父项目分开分发的。

  • 相关阅读:
    大屏自适应容器组件-Vue3+TS
    Windows系统关机后自动重启的解决方法
    MonkeyRunner自动化测试
    不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃
    借助适用于 Android 的 Material 运动效果构建精美的过渡
    自动化测试框架pytest系列一
    jqPlot——基于jquery的图表绘制工具简单使用,jqPlot 在firefox 火狐浏览器里面,图表右侧的标题,变形的解决方法
    Vue中使用Switch开关用来控制商品的上架与下架情况、同时根据数据库商品的状态反应到前台、前台修改商品状态保存到数据库
    SPDK/NVMe存储技术分析之用户态ibv_post_send()源码分析(一)
    VS2019 Qt源码编译
  • 原文地址:https://blog.csdn.net/leesinbad/article/details/133843191