当前位置:首页 > 开发工具 > Maven pom.xml中的元素modules、parent、properties以及import

Maven pom.xml中的元素modules、parent、properties以及import

2022年11月09日 10:09:55开发工具9

前言

  项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单

  maven的核心是 pom.xml,那么我们就来看看那些不同的地方

  给我印象最深的就是如下四个元素:modules、parent、properties、import

modules

  从字面意思来说,module 就是模块,而 pom.xml 中的 modules 也正是这个意思,用来管理同个项目中的各个模块

  如果 maven 用的比较简单,或者说项目的模块在 pom.xml 没进行划分,那么此元素是用不到的

  稍微复杂一点的项目都是要用到的

  需求场景

    如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行 mvn 命令)?

    当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗

    简单的做法就是使用聚合,一次构建全部模块

  具体实现

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

  Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记

    因为是个聚合体,仅仅负责聚合其他模块,那么就只需要上述目录,该删除的就删了

    注意 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>
</project>

    创建子模 account-register、account-persist

    右击 account-aggregator,new --> other --> Maven,选择 Maven Module,创建 moven 模块

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记

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

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记

     当我们打开包结构的子模块的 pom.xml 时,发现比预期的多了一些内容,我们做下处理就好了

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记

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

parent

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

  需求场景

    若每个子模块都都用的了 spring,那么我们是不是每个子模块都需要单独配置 spring依赖了?

    这么做是可以的,但是我们有更优的做法,那就是继承,用 parent 来实现

  具体实现

    配置父 pom.xml

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

      父(account-aggregator) pom.xml

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<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>
View Code

    account-register 的 pom.xml

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath> <!-- 与不配置一样,默认就是寻找上级目录下得pom.xml -->
  </parent>
  <artifactId>account-register</artifactId>
  <name>account-register</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>    <!-- 配置自己独有依赖 -->
      <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>1.4.3</version>
      </dependency>
    <dependency>
      <groupId>com.icegreen</groupId>
      <artifactId>greenmail</artifactId>
      <version>1.4.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
View Code

    account-persist 的 pom.xml

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <artifactId>account-persist</artifactId>
  <name>account-persist</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>    <!-- 配置自己独有依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.16</version>
    </dependency>
  </dependencies>
</project>
View Code

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

  依赖管理

    继承可以消除重复,那是不是就没有问题了? 还是有小瑕疵的

    假设将来需要添加一个新的子模块account-util,该模块只是提供一些简单的帮助工具,不需要依赖spring、junit,那么继承后就依赖上了,有没有什么办法了?

    有,maven已经替我们想到了,那就是 dependencyManagement 元素,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性

    在 dependencyManagement 元素下得依赖声明不会引入实际的依赖,不过它能够约束 dependencies 下的依赖使用

    在父 pom.xml 中配置 dependencyManagement 元素

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<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>
  
  <dependencyManagement>
      <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>
  </dependencyManagement>
</project>
View Code

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

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <artifactId>account-persist</artifactId>
  <name>account-persist</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
      <!-- spring 依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
    
      <!-- junit 依赖 -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.16</version>
    </dependency>
  </dependencies>
</project>
View Code

    使用这种依赖管理机制似乎不能减少太多的POM配置,就少了version(junit还少了个scope),感觉没啥作用呀

    其实作用还是挺大的,父 pom.xml 使用 dependencyManagement 能够统一项目范围中依赖的版本

    当依赖版本在父POM中声明后,子模块在使用依赖的时候就无须声明版本,也就不会发生多个子模块使用版本不一致的情况,帮助降低依赖冲突的几率

    如果子模块不声明依赖的使用,即使该依赖在父 pom.xml 中的 dependencyManagement 中声明了,也不会产生任何效果

import

  import 只在 dependencyManagement 元素下才有效果,作用是将目标 pom.xml 中的 dependencyManagement 配置导入并合并到当前 pom.xml 的 dependencyManagement 元素中

  如下就是讲 account-aggregator中 的 dependencyManagement 配置导入并合并到当前 pom.xml 中

<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

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

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

  内置属性

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

  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}

  自定义属性

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

Maven pom.xml中的元素modules、parent、properties以及import _ JavaClub全栈架构师技术笔记
<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>
      <module>account-another</module>
  </modules>
  
  <properties>
      <!-- 定义 spring版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <junit.version>4.7</junit.version>
  </properties>
  
  <dependencyManagement>
      <dependencies> <!-- 配置共有依赖 -->
      <!-- spring 依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
      <!-- junit 依赖 -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  </dependencyManagement>
</project>
View Code

  settings属性

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

  Java系统属性

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

  环境变量属性

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

聚合与继承的关系

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

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

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

结束语

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

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

作者:青石路
来源链接:https://www.cnblogs.com/youzhibing/p/5427130.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/tool/68679.html

标签: Maven
分享给朋友:

“Maven pom.xml中的元素modules、parent、properties以及import” 的相关文章

使用maven来管理java项目

使用maven来管理java项目

初学maven,简单总结一下学习心得,若有不对的地方,欢迎各位大神给我指正~ 总结分为6个部分 maven概述 maven安装 maven项目结构和创建方法 maven配置文件settings.xml 项目对象文件pom.xml解析...

Maven聚合与继承的实例讲解(一)

Maven聚合与继承的实例讲解(一)

概述 在javaweb高速发展的今天,我们软件设计人员往往会用很多种方式对软件划分模块,目的就是为了能有清晰的设计和低耦合性的,高重用性的软件。Maven有很好的依赖管理系统(Dependency Management System)和项目生命周期的管理(Project...

maven的pom.xml文件标签含义

pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。 [xml] view plain copy p...

maven下载及安装

maven下载及安装

一、下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1.1 ),下载完成后,解压到某个目录,本人解压到了D:\install\maven\...

Maven之scope详解

Maven中的依赖作用范围概述 Maven中使用 scope 来指定当前包的依赖范围和依赖的传递性。常见的可选值有:compile, provided, runtime, test, system 等。scope 主要是用在 pom.xml 文件中的依赖定义部分,例如:...

Maven---pom.xml配置详解

1.概述 pom中节点如下分布 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

Maven打包报错:[WARNING] The POM for xxx is missing, no dependency inform

Maven打包报错:[WARNING] The POM for xxx is missing, no dependency inform

maven install 或 package 时 ,执行警告报错: [WARNING] The POM for com.xx-base:jar:1.0 is missing, no dependency information available [ERROR] Fail...

使用IntelliJ IDEA 14和Maven创建java web项目

使用IntelliJ IDEA 14和Maven创建java web项目

http://mark.leanote.com/post/%E4%BD%BF%E7%94%A8IntelliJ-IDEA-14%E5%92%8CMaven%E5%88%9B%E5%BB%BAjava-web%E9%A1%B9%E7%9B%AE 安装Maven 下载安装...

maven-surefire-plugin总结

Maven通过Maven Surefire Plugin插件执行单元测试。(通过Maven Failsafe Plugin插件执行集成测试)   在pom.xml中配置JUnit,TestNG测试框架的依赖,即可自动识别和运行src/test目录下利用该框架编写的...

Maven学习(一) -- 安装Maven及Eclipse中配置Maven

Maven学习(一) -- 安装Maven及Eclipse中配置Maven

标签(空格分隔): 学习笔记 本文环境:Windows7, JDK1.7.0_76 安装及配置Maven环境变量 需要电脑中已经有Java环境 在控制台中输入:echo %JAVA_HOME%看是否能显示java home的路径信息;...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。