什么是传递依赖
- 当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。
- 比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖。
依赖传递出现的问题
- 依赖传递出现的问题:经常出现jar包冲突,
- 解决方案:
- 直接排除指定的jar包
- 版本号限定原则
解决jar包冲突的方式(4种)
排除原则(常用)
- 代码示例:
<dependencies> <dependency> <groupId>com.sdh</groupId> <artifactId>project01</artifactId> <version>1.0-SNAPSHOT</version> <!-- 排除依赖项目中的jar包 --> <exclusions> <exclusion> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
版本号限定原则(常用)
- 代码示例:
<!-- 标记版本号 --> <!--添加属性--> <properties> <mysql.version>5.1.42</mysql.version> </properties> <!--02版本锁定--> <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 依赖管理,上面已经锁定了版本号,这里不需要写版本号 --> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
路径就近原则(基本不用)
- 就是依赖的项目中,哪个依赖的项目近就依赖那个项目中的包
第一声明优先原则(基本不用)
- 依赖中,那个依赖先写的,就先依赖那个项目
- 注意:如果是直接依赖,不遵循第一声明原则,后面会覆盖前面的依赖
- 看图:左边路径就近原则,右边第一声明优先原则
传递依赖对依赖范围的影响
- A项目直接依赖B项目(最左边一列A和B的依赖范围)
- B项目直接依赖C项目(最上面一行B和C的依赖范围)
- 交叉点A和C的依赖范围
分模块构建项目
- 上面已经讲解了依赖,那么我们就可以把以前分层(MVC模式)的项目使用Maven模块,进行再次分离
- 如图(每个模块都是一个Maven项目):
理解继承和聚合
继承
- 开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar。
- 继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复。
- 比如:设置编译版本、锁定mysql的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
- 注意:
- 父级项目只能是pom打包方式。
- 子项目是一个Maven Module
聚合
- 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
- 能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。
- 注意:
- 根项目(模块)是一个pom项目。
- 子模块:Maven Module
- 每个模块写完后需要上传到私服
- 打包,需要整体打包找到最后的war项目使用Tomcat加载
- 实际中,我们会将一些庞大的项目拆分为若干模块进行开发
- 三层+MVC 如下(打包方式jar war):
- dao (包含实体类、utils)———-jar
- service——jar
- web———-war
聚合与继承的关系
- 聚合是为了方便
快速构件项目
。对于聚合模块来说,它知道有哪些被聚合的模块,但那些模块不知道这个聚合模块的存在;- 继承是为了
消除重复配置
。对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但是子模块必须知道自己的父POM是什么。
案例演示继承和聚合
- 第一步:创建父工程,修改pom.xml文件
- 第二步:创建dao,并继承父工程
- 第三步:创建service,并继承父工程
- 第四步:创建web,并继承父工程
- 第五步:运行
注意
:分模块开发项目编译、打包、安装需要使用使用父工程来整体操作。如果要操作单个子模块,最后先整体安装一次,因为单个子模块需要依赖信息。- 方法1:在maven-web工程的pom.xml中配置tomcat插件运行
- 运行maven-web工程它会从本地仓库下载依赖的jar包,所以当maven-web依赖的jar包内容修改了必须及时发布到本地仓库,比如:maven-web依赖的maven-service修改了,需要及时将maven-service发布到本地仓库。
- 方法2:在父工程的pom.xml中配置tomcat插件运行,自动聚合并执行
- 推荐方法2,如果子工程都在本地,采用方法2则不需要子工程修改就立即发布到本地仓库,父工程会自动聚合并使用最新代码执行。
注意
:如果子工程和父工程中都配置了tomcat插件,运行的端口和路径以子工程为准。- 不推荐在pom.xml文件中配置Tomcat插件,因为不灵活,版本受限。可以配置自己的Tomcat。
pom.xml配置文件中
在配置文件中可以定义变量:
# src/main/java/config9/test.properties # ${xx} 是动态取值 username9=${username} name9=${name} url9=${url} finalName9=${build.finalName} basedir9=${basedir}
pom中定义 filtering=true,则配置文件中的 ${xx} 会填充数据
<resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.txt</exclude> </excludes> <!-- 导入的配置中如果有 ${xx} 表达式,则解析并填充值 --> <filtering>true</filtering> </resource>
pom文件中的标签和properties中的值可以获取
<!-- pom.xml --> <artifactId>my-web</artifactId> ... <name>my-web Maven Webapp</name> <!-- ${name} --> <url>http://www.example.com</url> <!-- ${url} --> <properties> ... <username>sdh</username> <!-- ${username} --> </properties> <build> <finalName>my-web</finalName> <!-- ${build.finalName} --> ... <resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.txt</exclude> </excludes> <!-- 导入的配置中如果有 ${xx} 表达式,则解析并填充值 --> <filtering>true</filtering> </resource> </build>
filter
- 定义一个properties文件
# src/main/java/config/param.properties p1=111 p2=222
<build> ... <!-- 导入外部文件,${xx} 可以从中获取数据 --> <filters> <filter>src/main/java/config/param.properties</filter> </filters> ... </build>
# 配置文件中获取参数 pp=${p1} ppp=${p2}