详解IDEA多module项目maven依赖的一些说明

不管eclipse有没有被被时代抛弃,反正是被我抛弃了,因为IDEA是真的好用

现在公司的项目基本都是基于maven的多module项目,controller,service,model,dao等都被分成了不同的module,这样做当然也是为了解耦。

这些module可根据需要在pom.xml配置来打成war包或者jar包

<packaging>jar</packaging>

web主项目设置packaging级别为war,dao、model这些module设置packaging级别为jar。

module之间可以通过module自己的pom.xml来进行相互引用或依赖,如:

<dependency>
      <groupId>cn.com.autohome.mall</groupId>
      <artifactId>mall-common</artifactId>
    </dependency>
    <dependency>
      <groupId>cn.com.autohome.mall</groupId>
      <artifactId>mall-api-model</artifactId>
    </dependency>

这样在 File -> project structure 下,选中主web项目

从上面的截图可以看出来依赖的第三方jar和依赖项目子module的区别。

maven在执行install,packaging是jar的会被打成jar放在target目录下,packaging是war的会被打成war放在target目录下。
另外两个target目录会有一点区别,war的target目录会多出来一个和module同名的文件夹,这个文件夹和war解压后完全一致。

所有依赖的jar(包括依赖的module,被打成jar)都会被放lib下
这样在部署的时候,只需要部署相应的war即可。

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

多个module不需要分别执行mvn命令,可以使用聚合(aggregator)来一次构建全部模块

modules

在父pom.xml中通过

 <modules>
    <!-- 模块都写在此处 -->
   <module>mall-common</module>
   <module>mall-api-model</module>
 </modules>

来引用所有需要构建的子模块

parent

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

场景

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

实现

父(account-aggregator)pom.xml

 <modules>
   <!-- 模块都写在此处 -->
  <module>mall-common</module>
  <module>mall-api-model</module>
 </modules>

 <dependencies> <!-- 配置共有依赖 -->
  <!-- spring 依赖 -->
   <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</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>

子pom.xml

<parent>
  <groupId>xx.xx.xx</groupId>
  <artifactId>aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relativePath> <!-- 与不配置一样,默认就是寻找上级目录下得pom.xml -->
</parent>

 <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>

依赖管理

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

在父pom.xml中配置dependencyManagement元素

<modules>
   <!-- 模块都写在此处 -->
  <module>mall-common</module>
  <module>mall-api-model</module>
 </modules>

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

子pom.xml

<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>

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java10下编译lombok注解代码分享

    序 本文主要研究下在带有lombok(1.16.20版本)注解的代码在java10下的编译问题. 问题 Fatal error compiling at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) at org.apa

  • Intellij IDEA安装lombok插件及使用详解

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但自动生成这些代码后,如果bean中的属性一旦有修改.删除或增加时,需要重新生成或删除get/set等方法,给代码维护增加负担.而使用了lombok则不一样,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@Equals

  • eclipse 安装lombok插件

    下载lombok 下载地址: https://projectlombok.org/downloads/lombok.jar 或者访问官网下载  https://projectlombok.org/ 安装完成 这样已经可以使用了! 总结 以上所述是小编给大家介绍的eclipse 安装lombok插件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

  • lombok注解介绍小结

    lombok注解介绍 lombok注解文档 lombok官网下载 lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读-不过,还是能看得懂吧,废话不多说,先看一下lombok支持的一些常见的注解. @NonNull @Cleanup @Getter/@Setter @ToString @EqualsAndHashCode @

  • Spring Boot利用Lombok减少Java中样板代码的方法示例

    前言 Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法:在使用Lombok之后,将由其来自动帮你实现代码生成,注意,其是在运行过程中,帮你自动生成的.就是说,将极大减少你的代码总量. Lombok的官方地址: https://projectlombok.org/ 其实说实话第一次听到Lombok的时候,是从一个带我的匈牙利老师傅那里学来的.那个时候他给了我一套J

  • java项目中使用 Lombok遇到的问题小结

    一.Maven项目使用步骤一般包含两步,1)引入依赖 2)特定的 IDE 引入对应的插件 1)在POM中引入依赖 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version

  • Spring Boot中lombok的安装与使用详解

    前言 众所周知Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用.文中详细介绍了lombok的安装与使用教程,话不多说了,来一起看看详细的介绍吧. 1. Lombok Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法:在使用Lombok之后,将由其来自动帮你实现代码生成,注意,其是在运行过程中

  • idea中解决maven包冲突的问题(maven helper)

    日常开发中经常会遇到xxx.class 找不到的异常,但是这个类确实存在我们的项目中,就会感觉很离奇,其实这就是包冲突的问题 冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28 fastjson:1.2.3 我们用到了1.2.28中的某个类, 比如 A类,在版本更新中 1.2.3版本去掉了这个类,然而我们项目中maven 却把1.2.3的 jar 打包进去了,那我们就会报异常,不存在这个 class,但是我们调错误的时候却发现这个类存在,那我们

  • IDEA使用Lombok简化POJO代码的示例

    使用Lombok 简化POJO代码 正常编写一个java POJO 类 ,每次在做这个内容编写的时候都会需要很多的 get set 经常重复写,如果忘记写了一个也不容易找到 所以使用了Lombok maven 配置 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version&

  • 详解Lombok快速上手(安装、使用与注解参数)

    Lombok插件安装与使用说明 在实习中发现项目中IDE一直报检查错误,原来是使用了Lombok注解的黑科技,这里整理了一些日常编码中能遇到的所有关于它的使用详解,其实lombok项目的产生就是为了省去我们手动创建getter和setter方法等等一些基本组件代码的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法.即它最终能够达到的效果是:在源码中没有getter和setter等组件方法,但是在编译生成的字节码文件中有getter和setter等组件方法. 常见参数

随机推荐