04.maven分模块构建ssm项目知识准备

maven分模块构建ssm项目知识准备

一、maven基础知识回顾

maven是一个项目管理工具;提供 依赖管理一键构建

1). 依赖管理

maven对项目中jar包的管理过程。传统工程我们直接把jar包放置在项目中。maven工程真正的jar包放置在仓库中,项目中只用放置jar包的坐标。

1. 仓库的种类

  1. 本地仓库
  2. 远程仓库【私服】
  3. 中央仓库

2. 坐标的书写规范

  1. groupId 公司或组织域名的倒序
  2. artifactId 项目名或模块名
  3. version 版本号

3. 依赖范围

  1. Compile 默认:编译 测试 运行
  2. Provided 编译 测试
  3. Runtime 测试 运行
  4. Test 测试

2. 仓库之间的关系

当我们启动一个maven工程的时候,maven工程会通过pom文件中jar包的坐标去本地仓库找对应jar包。默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。在公司中,如果本地没有对应jar包,会先从私服下载jar包,如果私服没有jar包,可以从中央仓库下载,也可以从本地上传。

2). 一件构建

maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作。

注意:3.3+版本需要 jdkj.7+以上的支持

3). maven常用命令

  1. clean
  2. compile
  3. test
  4. package
  5. install
  6. deploy

4). maven三套生命周期

  1. 清理生命周期
  2. 默认生命周期
  3. 站点生命周期【几乎不用,了解即可】

二、坐标传递依赖规则

如下图【了解即可】,一个ssm整合中的父parent工程和子工程dao等,默认就是直接依赖,级别是compile;例如,如果父工程中导入了junit,scope是test,对照下图即可知道


04.maven分模块构建ssm项目知识准备_第1张图片
传递依赖下来的包是否能用.png

解决方案:一般遇到这种问题,直接在对象模块导入对应依赖的坐标即可!

三、maven工程依赖冲突覆盖以及解决方案

jar包冲突一般指的是jar包依赖的版本冲突!

在idea中,点击右边贴边栏的MavenProjects, 选择对应的项目,点击一个图标(如下为idea2018年2,其他版本可能不同),可以看到项目jar包依赖关系,可以根据此关系以及提示信息判断是否有jar包冲突!


04.maven分模块构建ssm项目知识准备_第2张图片
jar包坐标冲突提示.png

1). 方式①:【强烈推荐】 直接排除法

当我们要排除某个jar包下的依赖包,可以配置exclusions标签,内部可以不写版本号。代表的就是本jar包所依赖的依赖包版本;


    org.springframework
    spring-beans
    ${spring.version}
    
        
            org.springframework
            spring-core
        
    

3). 方式②:第一声明优先原则

在pom.xml中哪个jar包坐标配置靠前,哪个jar包就是先声明的先声明的jar包坐标下的依赖包,可以优先进入项目。

2). 方式③:路径近者优先原则

直接依赖路径不传递依赖路径近,最终进入项目的jar包将会是路径近的直接依赖包。

相关概念

  1. 直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包
  2. 简介依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。

4). 直接使用ssm工程需要的jar包坐标

正常情况下,配置一个ssm工程需要解决的jar包冲突需要3+小时以上,可以先配置好然后直接copy使用;

四、坐标版本锁定

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中。

在pom.xml中配置

1). 锁定jar包版本

maven工程是可以分为父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。比如:当前有A项目,项目B依赖A。那么A项目中所有的jar包都会传递到B项目中。B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。那么直接依赖的jar包会把A项目传递给B的jar包覆盖掉。为了防止以上情况的出现,可把A项目中主要jar包的坐标锁住,那么其他依赖该项目的项目中,即便是又同名jar包直接依赖,也无法覆盖!

  1. 格式

    
        
            org.springframework
            spring-context
            ${spring.version}
        
        ...
        
    
  1. 注意:锁定jar包版本的配置和配置依赖坐标的格式一样,但是锁定jar包只是将版本锁定,不能替代配置坐标依赖;在配置锁定时将需要被锁定jar包的坐标copy进锁定配置即可;

2). 统一版本的配置方式

使用pom.xml中的el表达式;方便版本更换!

  1. 配置统一版本


    5.0.2.RELEASE
    ...

  1. 使用方式

    org.springframework
    spring-tx
    ${spring.version}

...

五、maven的拆分与聚合思想

1). 工程和模块的区别


  1. 工程和模块都不等同于完整的项目,一个完整的项目看的是代码,代码完整,就可以判定这是一个完整的项目,与此项目是工程或者模块没有关系。

  1. 工程默认只能使用自己内部的资源,默认是独立的。工程可以和其他工程或者模块建立关系。模块默认不是独立的,默认属于父工程,模块一旦创建,所有父工程的资源都可以使用。

  1. 父子工程之间,子模块默认继承父工程,可以使用父工程所有资源。子模块之间是没有任何关系的。

  1. 父子工程之间不用建立关系,继承关系是默认的,不需要手动建立。

  1. 平级之间的引用叫依赖,依赖【scope】不是默认的需要建立;导入模块的坐标即可!导入了坐标之后,被导入模块的所有文件,包括配置文件,在导入的模块中都能使用,比如同一个父工程下的service和dao模块,如果service中导入了dao在坐标,那么service模块中就可以使用dao中的所有class文件以及相关的配置文件!

2). 继承与聚合

继承

继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml文件中的内容存在重复,比如:设置编译版本、锁定 spring的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。

聚合

项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web 三个工程最终会打一个独立的war 运行。


04.maven分模块构建ssm项目知识准备_第3张图片
maven父子工程.png

04.maven分模块构建ssm项目知识准备_第4张图片
maven工程拆分与聚合的思想.png

六、使用maven分模块构建ssm项目

代码详见maven分模块构建ssm项目

七、maven父子工程三种启动方式

1). 父工程启动maven中的插件

点击idea右侧贴边栏,选择父工程的插件,选择tomcat7,在点击tomcat7:run,即可

2). web模块启动maven中的插件

使用父工程,选择生命周期,双击install添加到本地仓库,然后执行web模块的tomcat7:run即可

3). idea中配置的本地tomcat

在idea中配置本地tomcat服务器即可!

你可能感兴趣的:(04.maven分模块构建ssm项目知识准备)