Maven 使用教程(三)
一、如何使用外部依赖项?
您可能已经注意到POM中的一个dependencies元素,我们一直在使用它作为示例。事实上,您一直在使用外部依赖项,但在这里我们将更详细地讨论它是如何工作的。有关更全面的介绍,请参阅我们的依赖机制介绍。
pom.xml的依赖项部分列出了我们的项目构建所需的所有外部依赖项(无论是在编译时、测试时、运行时还是其他时候)。现在,我们的项目只依赖于JUnit(为了清晰起见,我去掉了所有的资源过滤内容):
<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.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies>
</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即可:
<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"><groupId>com.mycompany.app</groupId><artifactId>my-other-app</artifactId>...<dependencies>...<dependency><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>
</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的样子:
<metadata><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.1.3</version><versioning><versions><version>1.1.3</version><version>1.2.4</version><version>1.2.5</version><version>1.2.6</version><version>1.2.7</version><version>1.2.8</version><version>1.2.11</version><version>1.2.9</version><version>1.2.12</version></versions></versioning>
</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中:
<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.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version><scope>compile</scope></dependency></dependencies>
</project>
现在,当我们编译项目(mvn-compile)时,我们将看到Maven为我们下载log4j依赖项。
二、如何在远程存储库中部署jar?
为了将jar部署到外部存储库,您必须在pom.xml中配置存储库url,并在settings.xml中配置用于连接到存储库的身份验证信息。
下面是一个使用scp和用户名/密码身份验证的示例:
<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.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.apache.codehaus.plexus</groupId><artifactId>plexus-utils</artifactId><version>1.0.4</version></dependency></dependencies><build><filters><filter>src/main/filters/filters.properties</filter></filters><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources></build><!--|||--><distributionManagement><repository><id>mycompany-repository</id><name>MyCompany Repository</name><url>scp://repository.mycompany.com/repository/maven2</url></repository></distributionManagement>
</project>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">...<servers><server><id>mycompany-repository</id><username>jvanzyl</username><!-- Default value is ~/.ssh/id_dsa --><privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)<passphrase>my_key_passphrase</passphrase></server></servers>...
</settings>
请注意,如果您连接到的openssh-ssh服务器的sshd_config中的参数“PasswordAuthentication”设置为“no”,则每次都必须键入密码进行用户名/密码身份验证(尽管您可以通过键入用户名和密码使用另一个ssh客户端登录)。在这种情况下,您可能希望切换到公钥身份验证。
如果在settings.xml中使用密码,应格外小心。
三、如何创建文档?
要开始使用Maven的文档系统,可以使用原型机制,使用以下命令为现有项目生成站点:
mvn archetype:generate \-DarchetypeGroupId=org.apache.maven.archetypes \-DarchetypeArtifactId=maven-archetype-site \-DgroupId=com.mycompany.app \-DartifactId=my-app-site
现在转到创建网站指南,了解如何为您的项目创建文档。
四、如何构建其他类型的项目?
请注意,生命周期适用于任何项目类型。例如,在基本目录中,我们可以创建一个简单的web应用程序:
mvn archetype:generate \-DarchetypeGroupId=org.apache.maven.archetypes \-DarchetypeArtifactId=maven-archetype-webapp \-DgroupId=com.mycompany.app \-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.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-webapp</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><finalName>my-webapp</finalName></build>
</project>
请注意<packaging>元素-这个元素告诉Maven构建为一个WAR。更改到Web应用程序项目的目录并尝试:
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.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>app</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>my-app</module><module>my-webapp</module></modules>
</project>
我们需要依赖于webapp中的JAR,所以将其添加到我的webapp/pom.xml中:
...<dependencies><dependency><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version></dependency>...</dependencies>
最后,将以下<parent>元素添加到子目录中的两个其他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.app</groupId><artifactId>app</artifactId><version>1.0-SNAPSHOT</version></parent>...
现在,请尝试…从顶级目录运行:
mvn verify
WAR现在已经在我的webapp/target/my-webapp.WAR中创建,JAR包括在内:
$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war0 Fri Jun 24 10:59:56 EST 2005 META-INF/222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF0 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.xml0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties52 Fri Jun 24 10:59:56 EST 2005 index.jsp0 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(称为应用程序)具有POM的封装和定义的模块列表。这个命令告诉Maven在一组项目上运行所有操作,而不是仅在当前项目上运行(要覆盖这种行为,可以使用--non-recurve命令行选项)。
接下来,我们告诉WAR它需要my-appJAR。这做了几件事:它使它在类路径上对WAR中的任何代码都可用(在这种情况下没有),它确保JAR总是在WAR之前构建,并且它指示WAR插件将JAR包括在其库目录中。
您可能已经注意到junit4.11.jar是一个依赖项,但最终并没有出现在WAR中。原因是<scope>test</scope>元素-它只是测试所必需的,因此不包括在web应用程序中,因为我的应用程序是编译时依赖项。
最后一步是包含父定义。这确保了POM始终可以定位,即使项目是通过在存储库中查找与其父项目分开分发的。
相关文章:
Maven 使用教程(三)
一、如何使用外部依赖项? 您可能已经注意到POM中的一个dependencies元素,我们一直在使用它作为示例。事实上,您一直在使用外部依赖项,但在这里我们将更详细地讨论它是如何工作的。有关更全面的介绍,请参阅我们的依赖机…...
行秋找工作的记录
2023-10-17 15:35-16:00 中移(苏州)研发中心面试 问了项目,还有一些我没准备到的Java八股文:Java类的加载过程,发射机制,redis存储结构,二叉平衡树等。但我也都没回答上来。应该无了。 2023-1…...

vue项目打包,使用externals抽离公共的第三方库
封装了一个插件,用来vue打包抽离公共的第三方库,使用unplugin进行插件开发,vite对应的功能使用了vite-plugin-externals进行二次开发 github地址 npm地址 hfex-auto-externals-plugin 自动注入插件,使用 unplugin 和 html-webpack-plugin进…...

九阳真经之各大厂校招
大学计算机系的同学要怎么努力才能校招进大厂? 秋招的大公司非常多,也是非常好的,赶上了秋招,你基本工作就敲定了,在整个应届毕业生的人群中你就占据很大的优势了。 如何准备应届校招? 一、做好规划,把…...

Go语言入门心法(五): 函数
Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 一: go语言函数认知 函数相关认知升维:函数的功能就是把相对独立的某个相同或者时类型的功能抽象处理,使之成为一个…...
gitignore文件的语法规则
行注释:以"#"符号开头的行表示注释,Git会忽略这些行。空行:空行会被忽略。文件和目录规则: 可以使用通配符来匹配文件和目录。常用的通配符有: “*”:匹配0个或多个字符。“?”:匹配…...

vscode提示扩展主机在过去5分钟内意外终止了3次,解决方法
参考链接: https://code.visualstudio.com/blogs/2021/02/16/extension-bisect https://code.visualstudio.com/docs/setup/uninstall#_clean-uninstall 使用vscode打开jupyter notebook记事本时,窗口右下角提示扩展主机在过去5分钟内意外终止了3次 而…...

【算法挨揍日记】day16——525. 连续数组、1314. 矩阵区域和
525. 连续数组 525. 连续数组 题目描述: 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。 解题思路: 本题的元素只有0和1,根据题目意思,我们可以把题目看成找一段最…...

k8s-13 存储之secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活 。 Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里 当 kubelet 为 pod 拉…...
什么是高阶成分(HOC)
高阶组件(Higher-Order Component,HOC)是一种在React中用于组件复用和逻辑抽象的设计模式。它本质上是一个函数,接受一个组件作为参数,并返回一个新的组件。 1. HOC的作用: HOC允许我们在不修改原始组件的…...
深度学习硬件配置推荐
目录 1. 基础推荐2. GPU显存与内存是一个1:4的配比?3. deep learning 入门和kaggle比赛4. 有些 Kaggle 比赛数据集很大,可能需要更多的 GPU 显存,请推荐显存4. GDDR6和HBM25. HDD 或 SATA SSD1. 基础推荐 假设您作为一个深度学习入门学者的需求,以下是一份推荐的电脑硬件配…...

数仓建设(一)
想了想,我们的数仓的建设是基于大数据平台进行的,中间也经历了比较曲折的过程。 每个行业都有自身的业务区别,不过很多还是比较相通的。 本文将全面讲解数仓建设规范,从数据模型规范,到数仓公共规范,数仓各…...

Springboot整合taos时序数据库TDengine
1.首先安装TDengine服务端在linux上 TDengine多种安装包的安装和卸载 - TDengine | 涛思数据安装过程直接去官网看,非常详细简单 2.出现的问题 windows连接 invalid app version 版本不对应 版本不对应的问题,需要在linux上安装的版本和windows client版本一致,不然w…...

Epoch、批量大小、迭代次数
梯度下降 它是 机器学习中使用的迭代 优化算法,用于找到最佳结果(曲线的最小值)。 坡度 是指 斜坡的倾斜度或倾斜度 梯度下降有一个称为 学习率的参数。 正如您在上图(左)中看到的,最初步长较大&#…...
qt-C++笔记之清空QVBoxLayout中的QCheckBox
qt-C笔记之清空QVBoxLayout中的QCheckBox QVBoxLayout 和 QCheckBox 是两个类,都是 PyQt/PySide 中用于创建图形用户界面 (GUI) 的工具。它们通常与 Qt 库一起使用,Qt 是一个流行的跨平台 GUI 库,可以用于创建桌面应用程序。 QVBoxLayout: Q…...
pc微信39223部分算法call偏移
WechatWin.dll 基址:78FD0000 MD5_Init_call 7AF48C80 | 56 | push esi | 7AF48C81 | 8B7424 08 | mov esi,dword ptr ss:[esp0x8] | 7AF48C85 | 6A 4C | push 0x4C …...

尚硅谷Flink(三)时间、窗口
1 🎰🎲🕹️ 🎰时间、窗口 🎲窗口 🕹️是啥 Flink 是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就…...

MPLS基础
1. MPLS原理与配置 MPLS基础 (1)MPLS概念 MPLS位于TCP/IP协议栈中的数据链路层和网络层之间,可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部,基于MPLS头部实现数据快速转发。 本课程仅介绍MPLS在…...
react+antd+Table实现表格初始化勾选某条数据,分页切换保留上一页勾选的数据
加上rowKey这个属性 <Table rowKey{record > record.id} // 加上rowKey这个属性rowSelection{rowSelection}columns{columns}dataSource{tableList}pagination{paginationProps} />...

Linux shell编程学习笔记13:文件测试运算
Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们依次研究了 Linux shell编程 中的 字符串运算、算术运算、关系运算、布尔运算 和 逻辑运算,今天我们来研究 Linux shell编程中的文件测…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...