Maven知识

文章目录

  • 一、概念
    • 1、官方文档
    • 2、什么是Maven?
  • 二、相关知识
    • 1、Maven生命周期
      • 1.1、clean
      • 1.2、default
      • 1.3、site
    • 2、Pom文件
    • 3、Pom常用元素
      • 3.1、项目基本元素
      • 3.2、<properties\></properties\>
      • 3.3、pom继承相关
      • 3.4、依赖管理相关
      • 3.5、构建管理相关
      • 3.6、<profiles\></profiles\>
  • 三、拓展
    • 1、Maven配置阿里云镜像加速

一、概念

1、官方文档

Maven官方文档

2、什么是Maven?

Maven, a Yiddish word meaning accumulator of knowledge, began as an attempt to simplify the build processes in the Jakarta Turbine project. There were several projects, each with their own Ant build files, that were all slightly different. JARs were checked into CVS. We wanted a standard way to build the projects, a clear definition of what the project consisted of, an easy way to publish project information, and a way to share JARs across several projects.
The result is a tool that can now be used for building and managing any Java-based project. We hope that we have created something that will make the day-to-day work of Java developers easier and generally help with the comprehension of any Java-based project.

大致可以理解为:构建和管理任何基于java的项目的工具

二、相关知识

1、Maven生命周期

Maven生命周期官方解释

Maven有三套生命周期,并且这三套生命周期之间是独立的,互不相关的。每个生命周期都有不同的阶段(Phases),这些不同的阶段之间是有序的,每个阶段必须在前面的阶段执行完后才可执行。
Maven的三套生命周期分别是:clean,default,site

1.1、clean

clean用于清理项目

PhaseDescription
pre-clean在实际的项目清理之前执行所需的过程
clean删除以前构建生成的所有文件
post-clean执行完成项目清理所需的流程

1.2、default

default是开发中经常用到的生命周期,项目的校验、编译、打包、部署等都在这里

PhaseDescription
validate验证项目是否正确,所有必要的信息是否可用
initialize初始化构建状态,例如设置属性或创建目录
generate-sources生成要包含在编译中的任何源代码
process-sources处理源代码,例如过滤任何值
generate-resources生成要包含在包中的资源
process-resources将资源复制并处理到目标目录中,准备打包
compile编译项目的源代码
process-classes对编译生成的文件进行后处理,例如对Java类进行字节码增强
generate-test-sources生成任何测试源代码以包含在编译中
process-test-sources处理测试源代码,例如过滤任何值
generate-test-resources为测试创建资源
process-test-resources将资源复制并处理到测试目标目录中
test-compile将测试源代码编译到测试目标目录中
process-test-classes对测试编译生成的文件进行后处理,例如对Java类进行字节码增强。
test使用合适的单元测试框架运行测试。这些测试不应该要求对代码进行打包或部署
prepare-package在实际包装前,完成包装前的准备工作。这通常会导致软件包的未打包、处理过的版本
package将编译后的代码打包成可分发的格式,比如JAR
pre-integration-test在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境之类的事情
integration-test如有必要,将包处理并部署到可以运行集成测试的环境中
post-integration-test执行集成测试后所需的操作。这可能包括清理环境
verify运行任何检查来验证包是有效的并且符合质量标准
install将包安装到本地存储库中,以便在本地其他项目中作为依赖项使用
deploy在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享

1.3、site

site主要用于生成项目的站点

PhaseDescription
pre-site在实际的项目站点生成之前执行所需的过程
site生成项目的站点文档
post-site执行完成站点生成所需的流程,并为站点部署做准备
site-deploy将生成的站点文档部署到指定的web服务器

2、Pom文件

Pom文件官方解释
POM代表“项目对象模型”。它是Maven项目的XML表示形式,保存在名为pom.xml的文件中。pom.xml文件中可以定义项目所需的版本、依赖、插件、构建等等

pom.xml:

这是直接在POM的项目元素下的元素列表。注意,modelVersion包含4.0.0。这是目前唯一支持的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><!-- The Basics --><groupId>...</groupId><artifactId>...</artifactId><version>...</version><packaging>...</packaging><dependencies>...</dependencies><parent>...</parent><dependencyManagement>...</dependencyManagement><modules>...</modules><properties>...</properties><!-- Build Settings --><build>...</build><reporting>...</reporting><!-- More Project Information --><name>...</name><description>...</description><url>...</url><inceptionYear>...</inceptionYear><licenses>...</licenses><organization>...</organization><developers>...</developers><contributors>...</contributors><!-- Environment Settings --><issueManagement>...</issueManagement><ciManagement>...</ciManagement><mailingLists>...</mailingLists><scm>...</scm><prerequisites>...</prerequisites><repositories>...</repositories><pluginRepositories>...</pluginRepositories><distributionManagement>...</distributionManagement><profiles>...</profiles>
</project>

3、Pom常用元素

3.1、项目基本元素

    <groupId>xxx</groupId><artifactId>xxx</artifactId><version>xxx</version><packaging>xxx</packaging><name>xxx</name><description>xxx</description>
  • <groupId>xxx</groupId>:通常使用完全限定的包名来将其与具有类似名称的其他项目区分开来(例如:org.springframework.boot)。
  • <artifactId>xxx</artifactId>:该工件的标识符,在由groupId给出的组中是唯一的。工件是由项目产生或使用的东西。(例如:spring-boot-starter-web)
  • <version>xxx</version>:这个项目产生的工件的当前版本。

一个gav(groupId,artifactId,version)可以标识唯一的包或插件
例:

        <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.8</version>
  • <packaging></packaging>生成该项目的类型,有jar、war、ear、pom四种类型,默认为jar
  • <name>xxx</name>:项目名称
  • <description>xxx</description>:项目表述文本

3.2、<properties></properties>

可以自定义一些公共的值在这个标签下统一管理,引用方式${xxx}

	<properties><revision>1.0.0-SNAPSHOT</revision><!-- dependent version --><spring-boot.version>2.7.15</spring-boot.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version><spring-cloud.version>2021.0.8</spring-cloud.version><lombok.version>1.18.30</lombok.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies>

3.3、pom继承相关

pom支持继承的方式复用父pom中的内容,以下是继承规则:

  • 子Pom继承父Pom的所有资源包括依赖、插件、构建方式
  • <dependencyManagement></dependencyManagement>或者<pluginManagement></pluginManagement>中的依赖(dependencies)或插件(plugins)不会被继承到子类,但是子类如果需要使用可以自己引入这里面的依赖(dependencies)或插件(plugins),并且不需要声明<version></version>(会自动继承父类的version)
  • 子pom和父pom声明同一个依赖(dependencies)或插件(plugins),如果子pom声明了<version></version>,子pom声明的version有限生效
    <parent><artifactId>xxx</artifactId><groupId>xxx</groupId><version>xxx</version><relativePath>../pom.xml</relativePath></parent><modules><module>xxx</module><module>xxx</module></modules>
  • <parent>…</parent>:子Pom中标识父Pom相关坐标
  • <relativePath>…/pom.xml</relativePath>:指定父Pom的相对路径,默认为…/pom.xml
  • <modules/module></modules/module>:子模块信息

3.4、依赖管理相关

   <dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version/><type></type><classifier></classifier><scope></scope><systemPath></systemPath><exclusions><exclusion><groupId/></groupId><artifactId></artifactId></exclusion></exclusions><optional/></dependency></dependencies>
  • <dependencies/dependency>…</dependencies/dependency>:依赖信息
  • <type>xxx</type>:依赖类型包括jar、war、pom等等,默认是jar。
  • <classifier>xxx</classifier>:引用附加的工件或区分属于同一POM但构建方式不同的两个工件

例子:
a、引用附加的工件

	  <dependency><groupId>com.test</groupId><artifactId>mytest</artifactId><version>1.0</version/><classifier>javadoc</classifier></dependency>

这样就会引入两个依赖mytest-1.0.jar和mytest-1.0-javadoc.jar

b、区分属于同一POM但构建方式不同的两个工件

	  <dependency><groupId>com.test</groupId><artifactId>mytest</artifactId><version>1.0</version/><classifier>jdk15</classifier></dependency>

我假设现在项目是jdk8,在mytest包中用的jdk15就可以这样声明

  • <systemPath>xxx</systemPath>:指定引用jar包的路径,例如:D:\a\b
  • <scope>xxx</scope>:指定依赖的作用域,包括compile、runtime、test、system、provided、import,默认是compile
  • compile:这是默认作用域。全程参与当前项目的编译、测试、运行时、打包。这个作用域是可传递的
  • runtime:该依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。
  • test:仅在测试编译和执行阶段可用。这个作用域不是可传递的
  • system:不会从maven库中取依赖,而是从本地文件拿。一般要搭配<systemPath></systemPath>使用
  • provided: 参与编译,测试,运行等周期但不参与打包,希望该依赖是容器或者jdk等提供。这个作用域不是可传递的
  • import:一般只用于<dependencyManagement></dependencyManagement>依赖管理中,把当前依赖下的所有依赖都引入进来。
  • <exclusions/exclusion>…</exclusions/exclusion>:排除相关依赖
  • <optional>xxx</optional>:表示该依赖是否是可选的。值只有true或者false,默认为false。true就是可选的,不会参与传递。
    例如:父pom的某个依赖包dependencyA内部引入了dependencyB,但是dependencyB使用了<optional>true</optional>,那么子pom里引入该依赖包dependencyA时不会一起引入dependencyB

3.5、构建管理相关

包括资源的加载、插件的管理等

    <build><finalName>xxx</finalName><resources><resource><directory>xxx</directory><filtering>false</filtering><includes><include>**/*</include></includes></resource></resources><plugins><plugin><groupId>xxx</groupId><artifactId>xxx</artifactId><version>1.0</version><executions><execution><id>xxx</id><phase>verify</phase><goals><goal>check</goal></goals></execution></executions></plugin></plugins></build>
  • <build>…</build>:包含构建项目所需的信息
  • <finalName>xxx</finalName>:构建项目生成的文件名
  • <resources/resource>…</resources/resource>:类路径资源配置
  • <directory>xxx</directory>:描述资源存储的目录。路径是相对于POM的。
  • <filtering>xxx</filtering>:是否过滤资源以用参数化值替换。值为true或者false,默认为false
  • <includes/include>xxx</includes/include>:要包含的文件路径
  • <excludes/exclude>xxx</excludes/exclude>:要排除的文件路径
  • <plugins/plugin>xxx</plugins/plugin>:插件信息
  • <pluginManagement></pluginManagement>:插件管理,一般用于pom继承时插件的管理,类似<dependencyManagement>
  • <executions/execution>xxx</executions/execution>:在构建生命周期中执行的一组目标的一个或多个规范,每个规范(可能)都有不同的配置。
  • <inherited>xxx</inherited>:插件是否可传递(继承到子类)
  • <id>xxx</id>:用于在构建期间标记目标,默认值:default
  • <phase>xxx</phase>:将此执行中的目标绑定到Maven的default生命周期中的阶段(参见Maven生命周期default)
  • <goals/goal>xxx</goals/goal>:绑定插件的声明周期中的阶段
  • <configuration>xxx</configuration>:可用于配置插件内部所需的配置信息

3.6、<profiles></profiles>

可用于动态环境激活项目

spring:profiles:active: @spring.profiles.active@
    <profiles><profile><id>dev</id><properties><spring.profiles.active>dev</spring.profiles.active></properties><!-- 默认环境 --><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>test</id><properties><spring.profiles.active>test</spring.profiles.active></properties></profile></profiles>

可在开发(dev)、测试(test)、生产(prod)环境等切换相应配置

三、拓展

1、Maven配置阿里云镜像加速

1、找到maven的setting.xml配置,一般在C:\Users\xxx.m2下
2、找到标签添加以下代码

<mirrors><mirror><id>aliyun</id><mirrorOf>*</mirrorOf><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public</url></mirror><mirror><id>aliyun-nexus</id><mirrorOf>*</mirrorOf><name>aliyun nexus</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror>
</mirrors>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ffmpeg将图片合成为mp4

首先在在图片文件夹输入cmd 这里确保已经安装ffmpeg并配置好环境变量。 然后这是我的文件夹目录&#xff1a; 将21张图片合成为mp4视频 这里使用如下命令&#xff1a; ffmpeg -framerate 1 -start_number 0 -i %d.png -c:v libx264 -pix_fmt yuv420p output.mp4 -framerat…

设计模式——中介者模式

引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建和修改客户资料的对话框&#xff0c; 它由各种控件组成&#xff0c; 例如…

最近IT圈子里有这样一句流行语:“Java已经死了,前端也已经凉了”?

Java与前端的发展前景 最近IT圈子里有这样一句流行语:“Java已经死了,前端也已经凉了”。这种极端看衰的语句似乎在散播焦虑,那么Java和前端的发展前景真的这么差吗? 就业市场而言,Java和前端仍然是最受欢迎的岗位之一。Java拥有强大的生态系统,前端技术发展迅速,都提供大量就…

[渗透测试学习] Analytics - HackTheBox

文章目录 信息搜集漏洞利用内核提权 信息搜集 nmap扫描一下端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.233发现两个端口&#xff0c;22端口为ssh服务&#xff0c;80端口有http服务 尝试访问80端口&#xff0c;发现重定向到http://analytical.htb/并且无法访问 编辑/…

Java+Swing: 数据回显和修改功能的实现 整理14

1. 数据回显 其实数据回显就是为修改功能的实现做准备的 1.1 在MainView类中&#xff0c;创建一个方法获取选中行的id // 获取选中的行的idpublic int[] getSelectedRowIds() {int[] selectedRows mainViewTable.getSelectedRows();int[] ids new int[selectedRows.length];…

第六届江苏人工智能大会成功举办,赛氪网荣获“优秀合作伙伴”奖项

2023年12月15日&#xff0c;第六届江苏人工智能大会在南京成功举办。本次大会汇集了众多人工智能领域的专家、学者和企业代表&#xff0c;共同探讨人工智能技术的最新发展和应用。江苏人工智能大会由江苏省人工智能学会&#xff08;简称&#xff1a;JSAI&#xff09;创办于2018…

【每日一题】反转二叉树的奇数层

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;广度优先搜索方法二&#xff1a;深度优先搜索 写在最后 Tag 【深度优先搜索】【广度优先搜索】【二叉树】【2023-12-15】 题目来源 2415. 反转二叉树的奇数层 题目解读 反转二叉树奇数层的节点。 解题思路 对于二叉…

Java八股文面试全套真题【含答案】- Element Plus篇

什么是Element UI 和 Element Plus&#xff1f; Element UI 和 Element Plus 是基于 Vue.js 的一套非常受欢迎的开源 UI 组件库&#xff0c;用于快速构建具有现代化设计和丰富交互效果的前端界面。Element UI 和 Element Plus 有哪些特点和优势&#xff1f; 提供丰富的组件库&a…

【LeetCode刷题笔记(8-1)】【Python】【接雨水】【动态规划】【困难】

文章目录 引言接雨水题目描述提示 解决方案1&#xff1a;【动态规划】结束语 接雨水 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但如果不了解代码背后的思考过程&#xff0c;那么这些代…

【扩散模型Diffusion Model系列】0-从VAE开始(隐变量模型、KL散度、最大化似然与AIGC的关系)

VAE VAE(Variational AutoEncoder)&#xff0c;变分自编码器&#xff0c;是一种无监督学习算法&#xff0c;被用于压缩、特征提取和生成式任务。相比于GAN(Generative Adversarial Network)&#xff0c;VAE在数学上有着更加良好的性质&#xff0c;有利于理论的分析和实现。 文…

C++指针

本文章对C指针的使用做一个全面的阐述与解释 1.1指针的定义使用 指针&#xff1a; 通过指针间接访问内存 指针就是地址 看下面代码&#xff1a; #include<iostream> using namespace std; int main(){//1、定义指针int * p;int a 10;//2、使用指针p &a;cout<…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

根据星历文件实现卫星的动态运行模拟matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .................................................................................... % …

测试用例的修改更新

测试用例的修改更新是指测试过程中由于用户需求的改变&#xff0c;或者测试过程中发现有新的需求产生&#xff0c;使得测试用例需要进行修改。修改更新测试用例不仅是一种测试技术&#xff0c;更是一种质量保证的方法。但修改和更新测试用例的技术要点在于&#xff1a; 1、执行…

ReactHooks大全—useEffect

React Hooks是一种在函数组件中使用状态和生命周期等特性的方法。useEffect是其中一个常用的Hook&#xff0c;它可以让你在组件渲染后执行一些副作用操作&#xff0c;比如发送网络请求、订阅事件、修改DOM等。在本文中&#xff0c;我们将介绍useEffect的基本使用、实现原理、最…

Note3---初阶二叉树~~

目录​​​​​​​ 前言&#x1f344; 1.树概念及结构☎️ 1.1 树的概念&#x1f384; 1.2 树的相关概念&#x1f99c; 1.2.1 部分概念的加深理解&#x1f43e; 1.2.2 树与非树&#x1fab4; 1.3 树的表示&#x1f38b; 1.4 树在实际中的运用&#xff08;表示文件系统…

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2) 简介 上篇重点介绍了OnnxSimplifier的库&#xff0c;其中的FixedPointFn迭代优化函数利用到了OnnxOptimizer这个官方的优化库&#xff0c;大部分的优化细节是在OnnxOptimizer内的。因此本篇重点介绍一下OnnxOpti…

飞天使-docker知识点12-docker-compose

文章目录 docker-compose命令启动单个容器重启容器停止和启动容器停止和启动所有容器演示一个简单示范 docker-compose 部署有依赖问题 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用简单的 YAML 文件来配置应用程序的服务、网络和存储等方…

全志V3s之NFS连接ubuntu22.04

1、问题一&#xff1a; [ 100.329728] VFS: Unable to mount root fs via NFS, trying floppy. [ 100.336262] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6 [ 100.343580] Please append a correct "root" boot option; here…

RT-Smart elf 动态加载技术 : 开启 ldso 动态加载

前言 RT-Smart,类似于Linux,可以动态的加载运行 应用程序 elf 文件 应用程序 elf 文件,有的是静态链接编译的,有的是动态链接编译的,动态链接编译的,还需要加载 动态共享库 (.so) 本篇讲解一下 RT-Smart 上 elf 动态加载功能的实现,顺便讲一下动态加载的原理 环境搭建 R…