Maven中的元素Exclusions、modules、parent、properties以及import

本文介绍Maven中的可选依赖、依赖排除、依赖调解原则及依赖管理等核心概念,并通过实例展示了如何利用Maven进行项目聚合与继承。

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

Dependencies:是可选依赖(Optional Dependencies) 
Exclusions:是依赖排除(Dependency Exclusions) 
2、Dependencies 
(1)当一个项目A依赖另一个项目B时,项目A可能很少一部分功能用到了项目B,此时就可以在A中配置对B的可选依赖。举例来说,一个类似hibernate的项目,它支持对mysql、oracle等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对mysql的支持,此时就可以在这个项目中配置可选依赖。 
(2)配置可选依赖的原因: 
1)节约磁盘、内存等空间; 
2)避免license许可问题; 
3)避免类路径问题,等等。 
(3)示例:

  1.  
    <project>
  2.  
    ...
  3.  
    <dependencies>
  4.  
    <!-- declare the dependency to be set as optional -->
  5.  
    <dependency>
  6.  
    <groupId>sample.ProjectB</groupId>
  7.  
    <artifactId>Project-B</artifactId>
  8.  
    <version>1.0</version>
  9.  
    <scope>compile</scope>
  10.  
    <optional>true</optional<!-- value will be true or false only -->
  11.  
    </dependency>
  12.  
    </dependencies>
  13.  
    </project>

 

  假设以上配置是项目A的配置,即:Project-A –> Project-B。在编译项目A时,是可以正常通过的。如果有一个新的项目X依赖A,即:Project-X -> Project-A。此时项目X就不会依赖项目B了。如果项目X用到了涉及项目B的功能,那么就需要在pom.xml中重新配置对项目B的依赖。假设A->B, B->x(可选), B->y(可选)。这里由于x,y是可选依赖,依赖不会传递,x,y将不会对a有任何影响

3、Exclusions 
(1)当一个项目A依赖项目B,而项目B同时依赖项目C,如果项目A中因为各种原因不想引用项目C,在配置项目B的依赖时,可以排除对C的依赖。 
(2)示例(假设配置的是A的pom.xml,依赖关系为:A –> B; B –> C):

  1.  
    <project>
  2.  
    ...
  3.  
    <dependencies>
  4.  
    <dependency>
  5.  
    <groupId>sample.ProjectB</groupId>
  6.  
    <artifactId>Project-B</artifactId>
  7.  
    <version>1.0</version>
  8.  
    <scope>compile</scope>
  9.  
    <exclusions>
  10.  
    <exclusion<!-- declare the exclusion here -->
  11.  
    <groupId>sample.ProjectC</groupId>
  12.  
    <artifactId>Project-C</artifactId>
  13.  
    </exclusion>
  14.  
    </exclusions>
  15.  
    </dependency>
  16.  
    </dependencies>
  17.  
    </project>

4、maven的依赖调解有两大原则:路径最近者优先;第一声明者优先。 
5、maven的归类依赖

  1.  
    <properties>
  2.  
    <springframework.version>2.5.6<springframework.version>
  3.  
    </properties>

定义此属性值后,maven会将pom中的所有的${springframework.version}替换成实际值2.5.6

 

modules

  从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块;如果maven用的比较简单,或者说项目的模块在pom.xml没进行划分,那么此元素是用不到的;不过一般大一点的项目是要用到的。

  1.需求场景

    如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行mvn命令)?当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗,那么简单的做法就是使用聚合,一次构建全部模块。

  2.具体实现

    a.既然使用聚合,那么就需要一个聚合的载体,先创建一个普通的maven项目account-aggregator,如下图:

  

    因为是个聚合体,仅仅负责聚合其他模块,那么就只需要上述目录,该删除的就删了;注意的是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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>
  
  <modules>
    <!-- 模块都写在此处 --> <module>account-register</module> <module>account-persist</module> </modules> </project>
复制代码
复制代码

    b.创建子模account-register、account-persist:右击account-aggregator,new --> other --> Maven,选择Maven Module,创建moven模块。

    c.创建完成后,项目结构如下,那么此时account-aggregator可以收缩起来了,我们操作具体子模块就好了。

                          

     d.注意点,当我们打开包结构的子模块的pom文件时,发现离预期的多了一些内容,我们坐下处理就好了。

    e.那么编码完了之后,我们只需要构建account-aggregator就好了,所有的子模块都会构建。

 

parent

  继承,和java中的继承相当,作用就是复用

  1.需求场景

    若每个子模块都都用的了spring,那么我们是不是每个子模块都需要单独配置spring依赖了?,这么做是可以的,但是我们有更优的做法,那就是继承,用parent来实现。

  2.具体实现

    a.配置父pom.xml

      我就用聚合pom来做父pom,配置子模块的公共依赖。

      父(account-aggregator)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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.youzhibing.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>

<name>Account Aggrregator</name>
<url>http://maven.apache.org</url>

<modules>
<!-- 模块都写在此处 -->
<module>account-register</module>
<module>account-persist</module>
</modules>

<dependencies> <!-- 配置共有依赖 -->
<!-- spring 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>

<!-- junit 依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>

b.account-register的pom.xml :

    c.account-persist的pom.xml :

    d.依赖的jar包全部ok,需要做的则是在各个模块中进行代码开发了!

  3.依赖管理

    继承可以消除重复,那是不是就没有问题了? 答案是存在问题,假设将来需要添加一个新的子模块account-util,该模块只是提供一些简单的帮助工具,不需要依赖spring、junit,那么继承后就依赖上了,有没有什么办法了? 有,maven已经替我们想到了,那就是dependencyManagement元素,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下得依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。

    在父pom.xml中配置dependencyManagement元素

    account-persist的pom.xml(account-register也一样) :

     使用这种依赖管理机制似乎不能减少太多的POM配置,就少了version(junit还少了个scope),感觉没啥作用呀;其实作用还是挺大的,父POM使用dependencyManagement能够统一项目范围中依赖的版本,当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,也就不会发生多个子模块使用版本不一致的情况,帮助降低依赖冲突的几率。如果子模块不声明依赖的使用,即使该依赖在父POM中的dependencyManagement中声明了,也不会产生任何效果。

import

  import只在dependencyManagement元素下才有效果,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement元素中,如下就是讲account-aggregator中的dependencyManagement配置导入并合并到当前POM中。

复制代码
复制代码
<dependencyManagement>
      <dependencies>
        <dependency>
            <groupId>com.youzhibing.account</groupId>
              <artifactId>account-aggregator</artifactId>
              <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
              <scope>import</scope>
        </dependency>
      </dependencies>
  </dependencyManagement>
复制代码
复制代码

properties(Maven属性)

  通过<properties>元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。

  Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;

  1.内置属性

    两个常用内置属性 ${basedir} 表示项目跟目录,即包含pom.xml文件的目录;${version} 表示项目版本

  2.POM属性

    用户可以使用该类属性引用POM文件中对应元素的值。如${project.artifactId}就对应了<project> <artifactId>元素的值,常用的POM属性包括:

    ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/

    ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/

    ${project.build.directory} : 项目构建输出目录,默认为target/

    ${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/

    ${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/

    ${project.groupId}:项目的groupId

    ${project.artifactId}:项目的artifactId

    ${project.version}:项目的version,与${version} 等价

    ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}

  3.自定义属性

    如下account-aggregator的pom.xml,那么继承了此pom.xml的子模块也可以用此自定义属性

  4.Settings属性

    与POM属性同理,用户使用以settings. 开头的属性引用settings.xml文件中的XML元素的值。

  5.Java系统属性

    所有java系统属性都可以用Maven属性引用,如${user.home}指向了用户目录。

  6.环境变量属性

    所有环境变量属性都可以使用以env. 开头的Maven属性引用,如${env.JAVA_HOME}指代了JAVA_HOME环境变量的的值。

聚合与继承的关系

  1.聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置;

  2.对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父POM是什么;

  3.聚合POM与继承中的父POM的packaging都必须是pom;同时,聚合模块与继承中的父模块除了POM外,都没有实际的内容

结束语

  maven越来越流行,这方面的资料也是越来越多,《Maven实战》给我的感觉就相当不错,本博客的内容大多取自其中;网上资料也越来越多,就博客园中就有不少;

  最后强调一点:看了是好,实践更好,写博客记录下来那是最好!

此文为网上整理文件

<think>嗯,用户想解决Maven依赖显示黄色警告的问题。首先,我需要回忆一下之前学过的相关引用内容。记得引用里提到过几个可能的原因,比如版本冲突、依赖未下载完整、或者IDE配置问题。 用户提到的黄色警告,可能对应引用中的情况。比如引用3里提到依赖变黄并提示漏洞信息,解决方法是在检查设置里取消相关选项。另外,引用4里提到JDK版本不一致导致的警告,需要确保项目各处的JDK配置统一。 首先,我应该考虑依赖未下载的情况。这时候需要让用户检查Maven仓库路径是否正确,然后执行mvn clean install或者通过IDE重新导入依赖。如果仓库路径没问题,可能依赖确实有问题,比如版本冲突,这时候需要排查pom.xml中的依赖版本,用mvn dependency:tree查看树结构,找出冲突的依赖并排除。 另外,IDEA的配置问题也可能导致黄色警告。比如引用1和引用2提到,Maven的配置路径不对,或者项目结构未正确识别多模块项目。需要用户检查File -> Settings里的Maven设置,确认仓库路径是否正确,并重新导入项目。如果是多模块项目,可能需要手动导入子模块的pom.xml。 还有可能是一些IDE的检查选项导致的,比如引用3提到的漏洞检查或者版本更新提示,可以在Inspections里关闭相关选项。此外,JDK版本不一致的问题,如引用4所述,需要确保项目Facets、Java Compiler和Installed JREs中的JDK版本一致。 最后,可能需要用户提供更多具体信息,比如错误提示内容或截图,以便更准确地判断问题所在。综合这些可能性,分步骤给出解决方法,帮助用户逐步排查和解决黄色警告问题。</think>### Maven依赖显示黄色警告的解决方法 #### 一、问题原因分析 Maven依赖出现黄色警告通常由以下原因导致: 1. **依赖未完整下载**:本地仓库路径配置错误或网络问题导致依赖包未下载成功 2. **版本冲突警告**:存在多个依赖版本冲突(常见于父子模块项目) 3. **安全漏洞提示**:依赖版本存在已知安全漏洞(IDEA 2020.3+新增的漏洞检查功能) 4. **JDK版本不一致**:项目配置的JDK版本与Maven编译版本不匹配[^4] 5. **多模块未识别**:IDEA未正确加载子模块的pom.xml文件[^2] #### 二、解决方案步骤 1. **检查仓库配置** - 打开IDEA设置:`File -> Settings -> Build -> Maven` - 确认`User settings file`指向正确的settings.xml - 检查`Local repository`路径是否包含完整依赖包 - 执行强制更新命令: ```bash mvn clean install -U ``` 2. **处理版本冲突** - 查看依赖树: ```bash mvn dependency:tree ``` - 在pom.xml中使用`<exclusion>`排除冲突依赖: ```xml <dependency> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>conflict-group</groupId> <artifactId>conflict-artifact</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **关闭安全检查提示** - 路径:`Settings -> Editor -> Inspections -> Package Search` - 取消勾选`Check for new dependency versions`和`Show vulnerabilities info`[^3] 4. **统一JDK版本** - 项目结构设置:`File -> Project Structure` - 确认`Project SDK`与`Project language level`一致 - 检查Modules中的Language level设置 - 修改pom.xml编译配置: ```xml <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> ``` 5. **处理多模块项目** - 右键项目选择`Maven -> Reimport` - 手动添加子模块:`File -> New -> Module from Existing Sources` - 确保父子pom.xml的`<parent>`配置正确[^2] #### 三、验证流程 ```mermaid graph TD A[黄色警告] --> B{检查依赖状态} B -->|未下载| C[执行mvn clean install] B -->|已下载| D{检查版本冲突} D -->|存在冲突| E[使用dependency:tree排查] D -->|无冲突| F[检查JDK配置] F -->|配置错误| G[统一JDK版本] F -->|配置正确| H[检查多模块结构] H -->|子模块问题| I[重新导入子模块] H -->|结构正常| J[关闭安全检查提示] ``` #### 四、预防措施 1. 在settings.xml中配置镜像仓库加速下载 2. 使用`<dependencyManagement>`统一管理依赖版本 3. 定期执行`mvn versions:display-dependency-updates`检查版本更新 4. 使用持续集成工具进行依赖验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值