Maven学习(一) - Maven基础

maven打包的5种方式总有一款适合你【超赞】 1.用于生成META-INF/MANIFEST.MF文件的部分内容,com.xxg.Main指定MANIFEST.MF中的Main-Class,true会在MANIFEST.MF加上Class-Path项并配置依赖包,lib/指定依赖包所在目录。2.maven-dependency-plugin插件。 阅读详情

Maven作为Java语言的构建和依赖管理工具,已经被广泛使用。但对于maven的pom.xml的配置以及插件的使用,大部分人也仅仅限于了解的程度。工欲善其事,必先利其器。在拖延了很久后,决定还是花时间根据《maven实战》这个书来进一步深入了解maven的使用。这个系列是在学习maven过程中的笔记和总结,聊以记录,利人利己。

maven坐标定义

  • groupId:当前maven项目隶属的实际项目,不止要到公司或组织,而应该到实际项目,应为项目往往会划分成多个模块,如org.sonatype.nexus,org.sonatype是一个组织,nexus是一个实际项目
  • artifactId:实际项目中的一个maven项目(模块),推荐使用实际项目名作为artifactId的前缀,比如上面的nexus的索引模块可为nexus-indexer,这样可区分不同实际项目的一些基础模块,比如base或core等模块
  • version:版本
  • packaging:maven项目的打包方式,jar打包和war打包构建的生命周期会有不同的命令,默认为jar
  • classifier:用来帮助定义构建输出的一些附属构件,如javadoc或sources。注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。

项目构建的文件名是与坐标相对应的,一般的规则是artifactId-version[-classifier].packaging,[-classifier]为可选

maven依赖配置

pom.xml中<dependencies>标签下包含一个或多个<dependence>元素,来声明一个或多个项目依赖。每个依赖可以包含的元素有

  • groupId、artifactId和version:依赖的基本坐标
  • type:依赖的类型,对应项目坐标的packaging
  • scope:依赖范围
  • optional:标记依赖是否可选
  • exclusions:用来排除传递性依赖

依赖范围

  • compile:scope默认依赖范围,对于编译,测试,运行三种classpath都有效,如spring-core
  • test:只对于测试classpath有效,如JUnit
  • provided:对编译和测试classpath有效,运行时无效。如servlet-api,因为运行时容器已经提供,不需要maven重复引入
  • runtime:测试和运行时classpath有效如JDBC驱动实现,编译时只需要JDK提供的JDBC接口
  • system:同provided范围一致,使用system范围的依赖不是通过maven仓库解析,而是通过systemPath元素显示指定依赖文件。因为可能造成构建的不可移植,应谨慎使用。

依赖传递

如果项目的依赖有自己的依赖,则项目也会加载依赖的依赖。比如spring-core依赖commons-logging,如果项目依赖了spring-core,那么它也会依赖commons-logging。当依赖的声明为可选时(<optional>true</optional>),依赖不会传递。

依赖调解

因为存在依赖传递,就会有不同的依赖中有不同版本的基础依赖,如A -> X(1.0),B -> C -> X(2.0),这样X就有不同的版本,哪个会被maven解析呢?于是就有了依赖调解的两个原则:

  1. 路径最近者优。,如上X(1.0)的路径为1,而X(2.0)的路径为2,因此X(1.0)会被使用
  2. 同等路径下,第一声明者优先。在路径长度都一致时,pom.xml中顺序靠前的被使用。

依赖排除

项目中可能存在,因为一些原因,不想引入某依赖的传递性依赖,则可以使用exclusions。比如在使用spring时不想用commons-logging,则可以在spring-core中排除。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>5.0.0.M5</version>
	<exclusions>
		<exclusion>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

依赖版本归类

比如在使用spring时,可能会用到spring-context,spring-jdbc,spring-tx等,但他们的版本是一致的,考虑到以后版本的升级,可以定义一个spring.version的properties来统一设置版本。

<properties>
    <spring.version>4.1.6.RELEASE</spring.version>
</properties>

而在依赖的<version>中用${spring.version}代替

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>${spring.version}</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${spring.version}</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>${spring.version}</version>
</dependency>

依赖查看与分析

// 查看项目依赖列表
mvn dependency:list
// 以树状显示依赖列表
mvn dependency:tree
// 依赖分析
mvn dependency:analyze

maven生命周期

maven有三套相互独立的生命周期,分别是clean,default,site。

  • clean的目的是清理项目
  • default的目的是构建项目
  • site的目的是建立项目站点

每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。default是生命周期中最核心的部分,它包含很多阶段,以下是常见的几种阶段,全量的阶段可见http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference。

  • validate:验证项目是否正确
  • compile:编译项目源代码
  • test:使用一个测试套件测试编译后的代码
  • package:打包项目代码
  • verify:检查集成测试结果
  • install:将打包好的项目代码安装到本地仓库
  • deploy:复制最后的打包结果到远程仓库

我们可以用命令行来执行生命周期阶段

  • mvn clean:调用clean生命周期的clean阶段,包含pre-clean和clean阶段
  • mvn test:调用default生命周期的test阶段,包含validate到test的所有阶段
  • mvn clean install:调用clean生命周期的clean阶段和default生命周期的install阶段,实际执行的是clean生命周期的pre-clean,clean阶段和default生命周期从validate至install的所有阶段

maven插件

插件目标

我们知道maven的核心只定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件存在,maven会在需要时下载并使用插件。对于一个插件,可能会有多个功能,每个功能就对应一个插件目标(Plugin Goal)。

比如maven-dependency-plugin有多个目标,如dependency:list,dependency:tree,dependency:analyze等,冒号前是插件前缀,冒号后是插件目标。类似的,compiler:compile(maven-compiler-plugin的compile目标)和surefire:test(maven-surefire-plugin的test目标)。

在使用时,需要将生命周期的阶段和插件目标相互绑定,以完成某个具体的构建任务。如maven-compiler-plugin的compile目标绑定的就是default生命周期的compile阶段。

maven内置了很多生命周期阶段同插件目标的绑定,比如打包类型为jar的default生命周期的内置插件绑定关系如下:

生命周期阶段插件目标执行任务
process-resourcesmaven-resources-plugin:resources复制主资源文件至主输出目录
compilemaven-compiler-plugin:compile编译主代码至主输出目录
process-test-resourcesmaven-resources-plugin:testResources复制测试资源文件至测试输出目录
test-compilemaven-compiler-plugin:testCompile编译测试代码至测试输出目录
testmaven-surefire-plugin:test执行测试用例
packagemaven-jar-plugin:jar创建项目jar包
installmaven-install-plugin:install将项目输出构件安装到本地仓库
deploymaven-deploy-plugin:deploy将项目输出构件部署到远程仓库

出了内置的绑定关系外,用户可以选择将某个插件目标绑定到生命周期的某个阶段。一个例子是创建项目的源码jar包,可以使用maven-source-plugin的jar-no-fork目标奖项目主代码打成jar文件,我们将其绑定到verify阶段。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-source-plugin</artifactId>
	<version>3.0.1</version>
	<executions>
		<execution>
			<id>attach-sources</id>
			<phase>verify</phase>
			<goals>
				<goal>jar-no-fork</goal>
			</goals>
		</execution>
	</executions>
</plugin>

有很多插件的目标在编写时已经定义了默认绑定阶段,可以使用命令查看

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1
Ddetail

可以看到输出的信息中有

source:jar-no-fork
...
Bound to phase: package

即jar-no-for默认绑定的生命周期阶段为package

插件配置

用户可以通过命令行和pom配置来配置插件的参数

1.命令行配置,用户可以在maven命令中使用-D参数,指定一个key-value的形式,来配置插件目标的参数。例如maven-surefire-plugin提供了一个maven.test.skip参数,当为true时,就跳过执行测试。

mvn install -Dmaven.test.skip=true

2.pom中插件全局配置,所有基于该插件目标的任务都会使用此配置,常见的youmaven-compiler-plugin编译java的版本。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.3.2</version>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<encoding>utf-8</encoding>
	</configuration>
</plugin>

3.用户可以为某个插件任务配置特定的参数,将maven-antrun-plugin:run绑定到多个生命周期阶段上,加以不同的配置

<plugin>
	<artifactId>maven-antrun-plugin</artifactId>
	<version>1.8</version>
	<executions>
		<execution>
			<id>ant-validate</id>
			<phase>validate</phase>
			<goals>
				<goal>run</goal>
			</goals>
			<configuration>
				<tasks>
					<echo>validate phase</echo>
				</tasks>
			</configuration>
		</execution>
		<execution>
			<id>ant-verify</id>
			<phase>verify</phase>
			<goals>
				<goal>run</goal>
			</goals>
			<configuration>
				<tasks>
					<echo>verify phase</echo>
				</tasks>
			</configuration>
		</execution>
	</executions>
</plugin>

插件查找

可以从http://maven.apache.org/plugins/index.html中查询插件的详细信息,也可以使用maven-help-plugin描述插件。

//查询插件信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1
//查询插件目标信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Dgoal=jar-no-fork
//查询详细信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:3.0.1 -Ddetail

Maven内置变量

Maven内置了一些目录变量,对涉及文件路径的配置会有帮助

  • ${basedir} 项目根目录
  • ${project.build.directory} 构建目录,缺省为target
  • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
  • {project.build.finalName} 产出物名称,缺省为project.build.finalName产出物名称,缺省为{project.artifactId}-${project.version}
  • ${project.packaging} 打包类型,缺省为jar
  • ${project.xxx} 当前pom文件的任意节点的内容
PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战 在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯 阅读详情

相关推荐

SSE消息推送避坑指南:从Chrome兼容性到Spring超时配置

本文深入探讨了在Java Spring Boot项目中实现SSE消息推送时,从浏览器兼容性到后端配置的完整避坑指南。针对Chrome并发连接限制、Safari自动断开、Nginx代理缓冲以及Spring SseEmitter内存泄漏与超时管理等生产环境常见问题,提供了具体的解决方案和最佳实践配置,帮助开发者构建稳定可靠的实时推送系统。

work3的博客 452

Maven中plugin配置说明

分享知识 传递快乐。

m0_67401746的博客 1257

基于FastLIO2与TEB算法的机器狗自主导航系统实战

本文详细介绍了如何为机器狗构建一套基于FastLIO2与TEB算法的自主导航系统。通过整合FastLIO2激光惯性里程计实现精准定位,并采用TEB局部规划器进行灵活路径规划与动态避障,解决了传统方案在复杂地形下反应慢、易碰撞的问题。文章提供了从环境搭建、算法部署、地图转换到系统调试的完整实战指南,帮助开发者实现机器狗的稳健自主行走。

beer8的博客 325

Maven常用插件配置(持续更新中)

一、maven-resources-plugin 配置描述:把web项目的输出copy到tomcat的webapp下 &lt;plugin&gt; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt; &lt...

guoyiqi 2085

无人机蜂群作战设计技术详解

构建防御网络,拦截敌方无人机或导弹;无人机蜂群作战设计技术是一种创新的军事应用概念,它基于生物仿生学原理,通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,以执行复杂多样的军事任务。无人机蜂群作战的概念源于自然界中蜜蜂、蚂蚁等生物群体的行为模式,这些生物群体通过简单的个体间的信息交互和分工协作,能够完成远远超出单一个体能力的复杂任务。其中,无人机群体是执行任务的主体,指挥控制系统负责任务分配和决策,通信数据链则保障无人机群体与指挥控制系统之间的信息交换。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 2217

RagFlow 文档解析

RAGFlow 的设计哲学是“高质量输入,高质量输出”,它通过提供可解释性和可控性的生成结果,让用户能够信任并依赖于系统提供的答案。

weixin_43008312的博客 3999

报错org.apache.maven.plugins:maven-resources-plugin

配置 maven-resources-plugin的时候报错显示红色,(这是解决后的截图) 解决办法,添加jar包依赖即可 <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId>

cptower的博客 8674

Golang面试(一)莉莉丝游戏-Golang后端开发-中台部门

莉莉丝游戏-Golang后端开发-中台部门 开场白,双方自我介绍,对方介绍这个岗位情况,erlang语言,全部转向go。 聊项目,介绍IM架构以及使用Go写的服务简介 动态扩容相关问题:平常30万,现在100万,你们现在是如何应对的? 如果让你调整架构实现动态扩容,你会怎么做?回答了kafka,是一种,应该还要使用docker和k8s以及微服务框架等 如果使用kafka,你是如何确保消息有序?回答了redis,好像没回答到那个点 消息发送失败的问题,如何做到消息不丢?回答持久化存储、拉消息和ACK 发送失

xmcy001122的专栏 3899

Maven 打包源代码插件

maven-source-plugin 2.1 true compile

凉粉 1279

Python+ArcGIS实战:5步搞定土壤类型预测(附随机森林模型配置技巧)

本文详细介绍了如何结合Python与ArcGIS,利用随机森林模型进行土壤类型预测。通过5个核心步骤——数据预处理、样本创建、模型构建、空间预测与精度验证,构建了一套自动化、高精度的空间预测工作流,并提供了关键的模型配置与调参技巧,助力GIS开发者高效完成土壤制图任务。

weixin_29227585的博客 396

避坑指南:ANSYS流固耦合计算中System Coupling数据传递设置与常见报错解决

本文深入解析ANSYS Workbench中System Coupling模块在双向流固耦合(FSI)计算中的应用,详细讲解数据传递机制、典型报错解决方案及高阶调试技巧。通过实际案例展示如何优化耦合步长、处理大变形问题,并提升并行计算效率,帮助工程师有效规避常见技术陷阱。

weixin_29213525的博客 731

maven学习一:maven基础介绍

maven初级使用教程

Asan 1333

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 871

Maven基础学习(一)

一、Maven概念 Maven是包括jar包管理和源码管理,程序编译三合一的优秀工具,越来越多的公司与项目开始接受并使用其作为项目构建与依赖管理工具,Apache Maven是一个基于java的apache ant的构建工具的替代者。 1、Maven是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告...

qq30211478的博客 600

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Maven基础学习(一)—Maven入门

原文地址:Maven基础学习(一)—Maven入门 已经配置,记着,待整理。

Hello Ward的博客 493

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Maven学习笔记(一)—— Maven基础

一、Maven介绍 1.1 什么是maven?   Maven是apache下的一个纯Java开发的开源项目,它是一个项目管理工具,使用maven对Java项目进行构建、依赖管理。 1.2 什么是项目构建?   项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程。 传统项目构建过程   传统使用eclipse构建项目的过程如下:        构建过程...

weixin_30273763的博客 130

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Maven基础学习记录一

maven的作用 目录结构 环境变量配置

zzxywh的专栏 141

maven基础学习(一)

用了一年的maven构建项目,但是对其强大的功能知之甚少,所以从今天起开始系统整理一下关于maven的资料. 1.maven的简单介绍:   maven是一个跨平台的项目管理工具,主要服务于基于java平台的项目构建,依赖管理,和项目信息管理等.   maven还为全世界的Java开发者提供了一个免费的中央仓库,在中央仓库里几乎可以找到任何的流行开源类库.   只要定位了坐标,maven就

sidongxue2的专栏 1098

零基础入门学习Maven(一)

Maven的下载可以从Maven官网下载 下载界面如图所示,选择Maven-3.6.3-bin.zip包下载即可 下载完成解压后可以看到里边内容如图所示 bin目录下内容如图,里边有一个mvn命令,非常重要的一个命令,用来构建项目 boot目录,里边是Maven运行所需要的类加载器 conf目录,里边有一个非常重要的配置文件settings.xml,是我们对Maven进行各种配置的时候...

weixin_44415928的博客 305

Maven学习(一):maven基础

一、安装(前提是java安装成功) 1、下载,并解压到固定文件夹中:如 D:\MyJAR\Use_JAR\apache-maven-3.2.3\bin 2、配置系统环境变量:新增M2_HOME : D:\MyJAR\Use_JAR\apache-maven-3.2.3 即解压的文件路径 3、配置path,把 M2_HOME 放入path变量值中或者也可以直接把地址放在 path 中,如: ...

laomumu1992的博客 188

maven学习基础知识篇一

文章结构: 1、Maven是什么? 2、使用Maven 3、总结 一、maven 是什么? Maven是一个项目管理工具,它采用“约定优于配置(COC)”的策略管理项目,利用Maven可以省去我们开发项目时,一个一个的去导入我们需要的jar包,在maven pom文件中配置好jar的坐标,启动Maven项目时,会自动帮我们下载jar到指定的本地目录,利用Maven可以将项目的源代码构

liwennewil的博客 380

Allegro PCB设计效率翻倍:测量单位切换与画布显示实战指南

在PCB设计领域,单位切换是高频操作,涉及毫米与mil的快速转换。其原理基于EDA工具内部固定单位与显示层换算机制,确保尺寸数据不变。掌握单位切换技术能显著提升设计效率,避免因单位混淆导致的线宽错误和阻抗问题。典型应用场景包括结构图与器件手册核对、布线规则检查及出Gerber前尺寸复核。通过快捷键绑定和状态栏显示,可将单位切换变为肌肉记忆。本文聚焦Allegro平台,详解单位切换与画布显示技巧,助力工程师提速降错。

weixin_33901926的博客 326

【JavaWeb学习笔记】(一)Maven基础+Web基础

Maven:一款用于管理和构建Java项目的工具,是一个开源项目。基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。①依赖管理:第三方jar包,在Maven的配置文件中描述信息即可导入首先基于Maven创建一个Java项目,在pom.xml更新依赖项会自动下载②项目构建:标准化跨平台编译(compile);测试(test);打包(package);发布(deploy)③统一项目结构:目录都是统一的,可以导入所有开发工具①构建生命周期/阶段:基于各个插件。

m0_73580478的博客 688

【项目管理工具】Maven学习笔记(一)Maven基础

1 Apache Maven简介 2 Apache Maven安装和配置 3 Apache Maven使用入门 参考资料: 1. Maven实战 1 Apache Maven简介 Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置。 Maven 工程结构...

源圈 223
上一篇: Maven学习(四) - 插件maven-resources-plugin
下一篇: hibernate中的某字段查询
lcathm
博客等级 码龄18年 37粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值