Maven中pom.xml标签作用
Maven学习知识点整理---pom.xml文件各个标签的作用及配置jar包依赖
转载原文:https://jym12138.blog.csdn.net/article/details/103234565
pom文件(project object model)
pom.xml文件为Maven项目的核心配置文件,Maven的各项插件以及依赖都可以在这里配置
三个必填标签
groupid 公司名 com.xxx
artifactId 项目名
version 版本号
dependencies标签:包含很多dependency标签
配置我们项目中需要哪些jar包
maven项目中要想下载指定jar包,就是在Pom中dependency配置
查找所需jar包的官网:
https://mvnrepository.com/
以mybatis为例:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
配置之后 编译完会在本地仓库里下载jar包
不仅把指定jar包下载 而且还会把它所依赖的包下载
已经下载过的jar包,不会重新下载(maven仓库是同一个仓库,如果换了仓库,也是会重新下载的),如果Jar包版本不一样 maven认为是不同的jar包
properties标签:用来定义pom一些属性
比如我们需要spring的jar包,各个模块的jar包需要同一个版本,这样就可以把这个版本号维护到properties标签里
package标签:指定如何构建项目的类型(war jar…)
bulid标签 指定如何构建项目的
source :指定当前构建的source目录
plugins: 指定进行构建时使用的插件
maven插件
maven 实际上是一个依赖插件执行的框架,每个任务都是插件执行的
两种插件类型:
Build plugins 在构建中执行,在pom里配置
reporting plugins 在网站生成中执行的,也需要在pom中配置
常用插件列表:
clean 项目构建之后 用于清理项目
compiler 编译java源代码的
jar 构建jar文件
war 构建war文件
tomcat…
各个插件官网文档都有作用的说明
pom文件可以继承,超级pom文件等等,比如pom文件定义了一些东西,另一个pom也想定义 就可以继承
————————————————
原文链接:https://blog.csdn.net/weixin_43326401/article/details/103234565
标签作用
scope(重点,难理解): 依赖管理。作用:依赖的作用范围,不同的值代表此依赖不同的作用范围,有以下几个值:
1.compile:不指定scope标签,默认是compile。作用:compile包括项目的编译,运行,打包阶段,意味着被compile修饰的依赖都参与这些阶段, 比如在项目B中C依赖被指定为compile,那么现在A依赖B,A一样可以使用C。因为C被指定可以参与打包,那么B被打包的过程中C一并参与B的打包,所以B包含C,因此A依赖于照样可以用。
2.provided:只编译,运行和打包均不参与。例如上述图片中的servlet被指定 provided。意思就是在写源码过程中提供此servlet API并保证编译成功,可是在运行阶段不提供此API。这里有个疑点,编译成功后,但我运行阶段没有servlet不是会报ClassNotFind错误吗? 这里我们要跳出一个误区,运行过程中JDK不一定使用源码中的API,但是可以使用其他地方的。此时的运行阶段源项目包中没有servlet API但是tomcat有!!! 因此在编译阶段用的是源码的servlet,他只保证编译成功,语法正确。在运行阶段中本项目被打包到容器的tomcat中去了,所以JDK使用的是tomcat自带的servlet API。
Tomcat的servlet.api路径如下:
在这里插入图片描述
3.runtime: 不参与编译阶段,参与运行和打包过程。被runtime描述的依赖,不参与源码的编译阶段,即在写源码的过程中也不会显示此依赖的库。但是在运行过程中,如果他会被激活使用。同时他参与打包。
4.test: 该范围表明相关test阶段,即测试编译代码的过程,其他阶段均不参与。
<!--
- <exclusions>外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题
- 如下依赖表示 项目acegi-security依赖 org.springframework.XXX 项目,但我们不需要引用这些项目
-->
<dependency>
<groupId>org.acegisecurity</groupId>
<artifactId>acegi-security</artifactId>
<version>1.0.5</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
插件
在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
xml 代码
<project>
< build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins<groupId>
<artifactId>maven-jar-plugin<artifactId>
<version>2.0<version>
<extensions>false<extensions>
<inherited>true<inherited>
<configuration>
<classifier>test<classifier>
<configuration>
<dependencies>...<dependencies>
<executions>...<executions>
<plugin>
<plugins>
< build>
< project>
extensions: true or false,是否装载插件扩展。默认false
inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
configuration: 指定插件配置
dependencies: 插件需要依赖的包
executions: 用于配置execution目标,一个插件可以有多个目标。
如下:
xml 代码
<plugin>
<artifactId>maven-antrun-plugin<artifactId>
<executions>
<execution>
<id>echodirid>
<goals>
<goal>run<goal>
<phase>verify<phase>
<inherited>false<inherited>
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}<echo>
<tasks>
<configuration>
<execution>
<executions>
<plugin>
说明:
id:规定execution 的唯一标志
goals: 表示目标
phase: 表示阶段,目标将会在什么阶段执行
inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
configuration: 表示此执行的配置属性
原文链接:https://blog.csdn.net/m0_54098516/article/details/124537103
二、依赖Jar包冲突原理,以及解决方案
举个例子,当我们的Web项目需要分别引入A架包与B架包;
但是A架包 和B架包 因为依赖的传递性,分别 引入了 C架包的
1.0版本和C架包的2.0版本,但是类加载器在执行的过程中只加载了1.0版本的架包,但是我们在编程或者写代码的时候,却调用了C架包中2.0版本中的多出的方法或者类,那么这个时候就可能会出现找不到方法或者,没有发现类的情况。
在这里插入图片描述
在这里插入图片描述
————————————————
原文链接:https://blog.csdn.net/helpluozhao123/article/details/125684190