进行分布式架构时,maven父子工程之间如何进行依赖

在设计分布式架构项目时,关于父子项目之间如何依赖,子与子项目之间的依赖调用-----产生了疑问,发现自己未曾思考过这个盲点

假设现在有如下项目结构:

   Parent 父项目;  `------ pom.xml

     ------- child-A  (交易服务)    --- pom.xml

      ------- child-B  (商品展示服务)   --- pom.xml

 

1、Parent怎么知道自己有几个孩子尼?且怎么找到自己孩子尼?(具体子模块的名单)

 在maven中,parent模块组织好childA和childB,叫做"聚合",多个模块联合编译。实现起来很简单,只需要在parent的pom文件 里   加入以下内容。

<modules>
   <module>child-A</module>
   <module>child-B</module>
</modules>

modules的名单告诉maven编译器,在读取parent的pom文件时去找到childA和childB,但还是会分别去编译他们引入的依赖。这就会导致 父子模块的pom文件引入的包彼此之间重复!!于是引入了"继承"的概念,使其形成"父子"关系,子pom可以引用到父pom中引入的依赖。

2. 如何让parent 和 child 的pom形成继承的关系,从而避免重复引入依赖,具体操作如下:

在parent中,写入以下内容,其中"***"标识的行可以组成一个路径,通过这个路径可以在maven仓库中找到这个pom文件!本例中,path为M2_Path/com/sang/main/Parent-Moduel/1.0.2/xxxx-1.0.2.pom。所以这三个标签是必须的!!

例如:

<modelVersion>4.0.0</modelVersion>  
<groupId>com.haha.student</groupId>              ***
<artifactId>Parent-Project</artifactId>         ***
<version>1.0.0</version>            ***
<packaging>pom</packaging>  
<name>Simple-main</name>

父pom写好了,子pom就通过<parent>标签继承父pom的依赖,如下:

<parent>
  <groupId>com.haha.student</groupId> 
  <artifactId>Parent-Project</artifactId> 
  <version>1.0.0</version> 
  <relativePath>../pom.xml</relativePath>  <!--可省略-->
</parent>

<modelVersion>4.0.0</modelVersion>

<groupId>com.haha.child-B</groupId> <!--和artifactId一起唯一标识这个jar文件-->

<artifactId>child-B-module</artifactId>

<packaging>jar</packaging> <!--指明打包类型-->

<name>childA</name>

值得注意的是<relativePath>标签,如果pom的层次关系就像本例中的那样只隔一层,则可以省略这个。maven同样可以找到子pom。

子pom中引入<parent>标签后,就会从父pom继承<version>等属性了,例如childA只需要再加入如下内容即可!

 

 

3、如何在不通过继承的关系下避免重复引入依赖尼?

maven可以让我们方便地管理jar包依赖,具体做法如下:

<dependencies>
     <dependency>               <!--添加一个jar包依赖-->
         <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0</version>
    </dependency>
</dependencies>

 

 

如果不通过继承,则需要在每个pom中加入这样的依赖,子pom对应的模块可以引用到这个jar包。

造成了重复引用jar包,可以通过下面的方式解决:

主pom中把依赖通过<dependecyManagement>引起来,表示子pom可能会用到的jar包依赖

 

<dependencyManagement>
   <dependencies>
      <dependency>
           <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
      </dependency>
   </dependencies>
</dependencyManagement>

子模块pom如果需要引用该jar包,则直接引用即可!不需要加入<version>,便于统一管理。此外也可以加入仅在子pom中用到的jar包,
如下:

<dependencies>
   <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>   <!--此处不再需要verison了!-->
   </dependency>
   <dependency>
       <groupId>org.codehaus.jackson</groupId>
       <artifactId>jackson-core-lgpl</artifactId>
       <version>1.9.4</version>    <!--当然也可以加入只在这个子模块中用到的jar包-->
   </dependency>
</dependencies>
 

4、除了jar包依赖,插件也可以通过这样的方式进行管理

parent的pom里内容

<!-- parent-Module -->
<build>
   <pluginManagement>
      <plugins>
          <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>2.1.1</version>
          </plugin>
      </plugins>
   </pluginManagement>
</build>

child-A的pom里内容
<!-- child-A -->
<build>   
   <plugins>
      <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
      </plugin>
   </plugins>
</build>

5、如果子pom之间存在引用关系,比如child-A引用到了child-B的jar包,该怎么做?

 如下: (注意:除了公共模块之类可以这样做外,不同服务的模块之间不建议这样使用,会造成牵扯到后续 分布式部署时子模块分别打包的问题,如果你们的整个应用只打一个包,当我没说哈)

<dependency>
   <groupId>com.module</groupId>
   <artifactId>child-A</artifactId>       <!--加上childA的依赖-->
   <version>1.0.0</version>
</dependency>

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值