maven使用pom文件中的各标签的理解

本文详细解读了Maven中的scope概念,包括不同scope的作用(如compile、test、runtime等),以及system和import的特殊用法。还介绍了pom.xml中的packaging、dependency的type属性和war插件配置。此外,讨论了如何处理没有jar包的pom依赖以及mavensettings.xml中的mirror标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

maven中的scope

这个scope,就像是 写java注解时的 @Retention(xxx) 的那个感觉,大约是一种 “生命周期”的感觉。
能体会到,理解到这个意思,基本上就够了。具体只是生效到哪个阶段而已。

1、compile:默认值,可省略不写。此值表示该依赖需要参与到项目的编译、测试以及运行周期中,打包时也要包含进去。
2、test:该依赖仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit。
3、runtime:该依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。
4、provided:该依赖在打包的时候可以不用包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude(排除)操作。
5、system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径(因为版权原因并不是所有依赖都从中央仓库下载的)
6、import: 一个dependencyManagement中的dependency,如果scope是import形式的,那么这个dependency不参与依赖传递。只是把dependency需要的依赖都取过来,像个占位符一样替换了就行。

以下为scope是system时举的例子:
例:有一个dm.jar在${basedir}/src/main/resources/lib目录下:

<dependency>
    <groupId>dm</groupId>
    <artifactId>dm</artifactId>
    <scope>system</scope>
    <version>1.0</version>
    <systemPath>${basedir}/src/main/resources/lib/dm.jar</systemPath>
</dependency>

如果是打包war包,并且打包完成后需要把本地的${basedir}/src/main/resources/lib/dm.jar和线上下载的依赖整合到一个目录的话,就还需要做如下配置:

    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webResources>
            <resource>
                <!--把本地lib里面的jar复制到lib-->
                <directory>src/main/resources/lib</directory>
                <targetPath>WEB-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

更多标签参考

pom.xml文件里

<packaging>pom</packaging>的作用

  1. 顶级的,<packaging>pom</packaging>是什么?
  2. <dependency>节点里,<packaging>pom</packaging>是什么?

重头戏,<type>pom</type> 怎么理解?
在这里插入图片描述

我们从maven仓库下载下来的依赖有的是只有pom文件没有jar包的,这时候如果需要依赖这个pom文件就需要写<type>pom</type>

上图一红一绿两条线,说了两件事。
红线的可以解释<type>里的值是什么意思。
绿线里的可以解释为什么有些时候<dependency>里面的<type>有时候不用加,有时候不加却报错加了就不报错(即通常为了获取继承来的pom.xml里面的<properties>里的各种包的版本号之类的信息,没有的话就不能确定版本,当然报错)。

例子: maven pom 文件中 dependence 的 type 为 pom 是什么意思?

在 Maven 的 pom 文件中,dependence 节点用于声明对其他项目的依赖。如果 dependence 的 type 属性设置为 “pom”,则意味着你依赖的是另一个项目的 pom 文件,而不是实际的项目的编译后的代码或者二进制文件。

这种情况通常出现在你希望继承另一个项目的配置信息,而不需要实际依赖该项目的代码时。例如,你可能希望将你的项目与另一个项目使用相同的依赖版本,或者使用相同的插件配置。在这种情况下,你可以在自己的 pom 文件中声明对另一个项目的 pom 文件的依赖,并在自己的 pom 文件中继承该项目的配置信息

<project>
  <!-- 省略其他信息 -->
  <dependencies>
    <!-- 依赖另一个项目的 pom 文件 -->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>other-project</artifactId>
      <version>1.0</version>
      <type>pom</type>
    </dependency>
  </dependencies>
</project>

在这个例子中,你的项目会依赖另一个项目的 pom 文件,但不会依赖另一个项目的代码。

build里的resource标签

resources中的***/*区别

  • \*指resource路径下,并不包含resource子文件夹下的文件
  • **/*指resource路径及其子路径下所有文件
  1. include、exclude可以配置多个路径,但路径不要重复,也别包含

include说明:打包时只保留include标签下的文件

include 的<filtering>说明:

  • true:可以规定指定路径下的xml包括properties文件在编译期,将文件指定的${key}替换掉;
    • 例如: 中我们使用${jdbc.url}来代表数据库地址。那么在Maven编译时,就会将${jdbc.url}替换成真正的地址。
    • false:不替换

exclude说明: exclude规定路径下的文件不被打包

exclude 的<filtering>说明

  • true: 不在exclude规定路径下,其他的文件由include决定
  • false: 不在exclude规定路径下,其他的文件不由include决定

include 、exclude二者可以配合使用,划定打包范围

默认情况下,maven打包会将资源目录(一般是src/main/resources)中的资源文件打包进去,而如果在pom.xml中配置了resources标签,则默认的资源打包策略就被覆盖掉了,只会打包resources标签中配置的资源文件**

基本结构:

<build>
    <resources>
        <resource>
            <directory>src/main/resource</directory>
	        <includes>
	             <include>...</include>
	        </includes>
	        <filtering>false</filtering>
        </resource>

        <resource>
            ...
        </resource>
    </resources>
<build>

案例:

<build>
	<resources>
			   <!-- 案例 1. 打包时只留下Java目录以及子目录下 .txt类型文件 -->
	           <resource>
	               <directory>src/main/java</directory>
	               <includes>
	                   <include>**/*.txt</include>
	               </includes>
	           </resource>
	           
	           <!-- 案例 2 保留 resources 下所有资源,不配置默认就是保存所有 -->
	           <!-- 案例 2.1 打包时留下resource目录以及子目录下所有文件 -->
	 			<resource>
	       	    	<directory>src/main/resources</directory>	         
	           </resource>
	           
				<!-- 案例 2.2 打包时留下resource目录以及子目录下所有文件,同案例二效果 -->
				<resource>
	       	    	 <directory>src/main/resources</directory>
	       	    	 <includes>
	                   <include>**/*.*</include>
	                   <include>**/*</include>   
	                </includes>	         
	           </resource>

				<!-- 案例 3. 打包时只留下resource目录以及子目录下的.yml文件 -->
				<resource>
	       	    	 <directory>src/main/resources</directory>
	       	    	 <includes>
	                    <include>**/*.yml</include>	                   
	                </includes>	         
	           </resource>

				<!-- 案例 4. 打包时除了resource目录以及子目录下的.yml文件,其他文件都会保留下来 -->
				<resource>
	       	    	 <directory>src/main/resources</directory>
	       	    	 <excludes>
                    	<exclude>**/*.yml</exclude>
                	</excludes>	         
	           </resource>
  					 
	</resources>
</build>

maven的打包类型

pom 项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的。

项目的打包类型

<packaging>pom</packaging>
<packaging>jar</packaging>
<packaging>war</packaging>

packing默认是jar类型,

  • pom ---------> 父类型都为pom类型
  • jar ---------> 内部调用或者是作服务使用
  • war ---------> 需要部署的项目

如果有时候springboot启动不了,那么有时候是启动类所在模块的pom.xml中jar改成了pom,改回来一般能启动.

mavensettings.xml标签

mirror标签
Maven 在构建 Spring Boot 项目时会根据 元素中定义的顺序依次尝试使用镜像源。如果找到可用的镜像源,将使用该镜像源进行构建。如果所有镜像源都不可用,将回退到默认的 Maven 中央仓库。

<think>好的,我现在需要回答用户关于Maven POM文件中<parent>标签的作用的问题。首先,我得回忆一下自己之前学过的Maven知识,确保理解正确。 用户可能是在使用Maven构建项目时遇到了问题,或者在阅读别人的POM文件时看到了<parent>标签,想要了解它的用途。他们可能对Maven的继承机制不太熟悉,所以需要简明扼要的解释,同时可能需要一些例子来帮助理解。 首先,<parent>标签的主要作用是继承父POM的配置。Maven中的项目继承允许子模块共享父项目的配置,比如依赖管理、插件配置、属性等。这样能够减少重复配置,保持项目的一致性。需要明确父POM的groupId、artifactId和version,以及可能的relativePath。 然后,我需要分点说明<parent>的作用。比如,依赖管理、统一版本、插件配置、属性继承等。同时,要提到父POM通常是聚合项目(多模块项目)的父模块,或者像Spring Boot Starter Parent这样的公司级或框架级的父POM。 可能需要解释继承和聚合的区别,因为有时候这两个概念容易混淆。聚合是用<modules>将多个子模块聚合在一起构建,而继承是通过<parent>来共享配置。 另外,需要注意父POM中的配置是否会被子模块继承,例如<dependencies>里的依赖会被子模块直接继承,而<dependencyManagement>里的则需要子模块声明才能引入。类似的,<build>中的插件配置如果不在<pluginManagement>中,也会被继承。 还要提到如果子模块需要覆盖父POM中的某些配置,可以直接在子POM中声明,这样会覆盖父级的配置。比如版本号的覆盖。 可能用户会疑惑relativePath的作用,是否需要特别说明。relativePath指定了查找父POM的位置,默认是../pom.xml,如果父POM不在默认位置,可能需要设置这个路径,或者从仓库下载。 最后,举一个例子会更有助于理解,比如Spring Boot项目通常继承自spring-boot-starter-parent,这样就能自动获得合适的依赖版本和插件配置,而无需自己指定每个依赖的版本。 需要确保语言口语化,避免技术术语过于晦涩,同时结构清晰,让用户能够一步步理解。可能还需要提醒常见的应用场景和注意事项,比如多模块项目中的使用,或者如何选择合适的父POM。 总结一下,我需要组织回答的结构:首先定义<parent>的作用,然后分点详细说明各个作用,接着举例说明,最后可能提到相关注意事项或常见用法。这样用户不仅能了解基本概念,还能知道实际应用中的情况。</think>在 Maven 项目的 `pom.xml` 文件中,`<parent>` 标签的主要作用是**声明当前项目继承自一个父项目**。通过继承父项目的配置,子项目可以复用父 POM 中定义的依赖、插件、属性等配置,减少重复代码,统一管理多模块项目的公共配置。 --- ### **`<parent>` 标签的核心作用** 1. **依赖管理(Dependency Management)** 父 POM 中可以通过 `<dependencyManagement>` 定义依赖的版本号,子项目只需声明依赖的 `groupId` 和 `artifactId`,无需重复指定版本,避免版本冲突。 2. **统一插件配置** 父 POM 中定义的插件(如编译插件、打包插件)及其配置会被子项目继承,确保所有模块使用一致的构建规则。 3. **共享属性** 父 POM 中定义的属性(如 `<properties>`)会被子项目继承,例如统一 JDK 版本、编码格式等。 4. **标准化项目信息** 父 POM 可以统一管理 `groupId`、`version` 等基础信息,子项目可以选择性覆盖。 --- ### **`<parent>` 标签的典型使用场景** 1. **多模块项目** 父 POM 通常用于聚合多个子模块(通过 `<modules>` 标签),子模块通过 `<parent>` 继承父 POM 的配置。例如: ```xml <!-- 子模块的 pom.xml --> <parent> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> </parent> ``` 2. **企业级统一配置** 公司内部可能定义一个公共父 POM,所有项目继承它,确保依赖版本、代码规范、安全扫描插件等全局统一。 3. **框架 Starter 模板** 例如 Spring Boot 的 `spring-boot-starter-parent`,继承后自动配置了 Spring Boot 的默认依赖、插件和属性: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.0</version> </parent> ``` --- ### **注意事项** - **覆盖父配置**:子项目可以重新定义属性或依赖版本,覆盖父 POM 的配置。 - **relativePath**:如果父 POM 不在默认位置(如本地仓库),需通过 `<relativePath>` 指定路径: ```xml <parent> <groupId>com.example</groupId> <artifactId>parent</artifactId> <version>1.0.0</version> <relativePath>../parent/pom.xml</relativePath> <!-- 指定父 POM 路径 --> </parent> ``` - **与 `<dependencyManagement>` 的区别**: `<parent>` 是直接继承配置,而 `<dependencyManagement>` 仅管理版本,需子项目显式声明依赖。 --- ### **简单示例** 假设一个父 POM 定义了 JDK 版本和 JUnit 依赖: ```xml <!-- 父项目的 pom.xml --> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <properties> <java.version>17</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project> ``` 子项目继承后,无需指定 JUnit 版本: ```xml <!-- 子项目的 pom.xml --> <parent> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- 版本从父 POM 继承 --> </dependency> </dependencies> ``` --- 通过 `<parent>` 标签Maven 实现了项目配置的复用和标准化,特别适合中大型项目或需要统一技术栈的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值