文章目录
- 前言
- 一、项目间的依赖关系
- 二、使用步骤
-
- 1.父pom
- 2.子POM
- 总结
- 三、重复依赖,依赖冲突
-
- 方法一:把父pom依赖的jar包排除掉
- 方法一:把父pom依赖的jar包覆盖掉
-
-
- 重点、重点、重点、
-
前言
maven是java项目的管理和构建工具。我们可以通过引入不同依赖,以满足项目开发。项目越大,引入的依赖就越多,带来的管理问题也就越来越突出。
因此,统一的依赖管理就显得尤为重要!
提示:以下是本篇文章正文内容,下面案例可供参考
一、项目间的依赖关系
示例:
二、使用步骤
1.父pom
使用dependencyManagement 和 pluginManagement ,声明子类POM中可能用到的依赖和插件,但并不会引入实际的依赖,或造成实际的插件调用行为,但能够约束子类POM中的依赖和插件配置的声明。
代码如下(示例):
<modelVersion>4.0.0</modelVersion>
<groupId>com.tomandersen</groupId>
<artifactId>HadoopCustomModules</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--模块名称-->
<modules>
<module>flume</module>
<module>log-collector</module>
</modules>
<!--事先声明版本属性-->
<properties>
<slf4j.version>1.7.20</slf4j.version>
<logback.version>1.0.7</logback.version>
</properties>
<!--在父类Maven中使用dependencyManagement声明依赖便于子类Module继承使用,也便于进行依赖版本控制-->
<dependencyManagement>
<dependencies>
<!--阿里巴巴开源json解析框架-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!--日志生成框架-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!--在父类Maven中使用pluginManagement管理插件便于子类Module继承使用,也便于进行依赖版本控制-->
<pluginManagement>
<plugins>
<!--配置Maven项目compiler插件-->
<!--此工具不会打包依赖-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!--配置Maven项目assembly插件-->
<!--此工具会将全部依赖打包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!--子类Maven通过mainClass标签设置成主类的全类名FQCN-->
<!--<mainClass></mainClass>-->
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
2.子POM
1)在子类POM中声明父类POM
2)配置实际使用的 dependency 和 plugin,只需要声明 groupId 和 artifactId 就可以,只有声明的才会进行实际的依赖引入或插件调用
3)版本在父POM中统一管理,不用指定版本。指定版本,则覆盖父类配置信息
代码如下(示例):
<!--声明父类POM-->
<parent>
<artifactId>HadoopCustomModules</artifactId>
<groupId>com.tomandersen</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--子类POM信息-->
<groupId>com.tomandersen</groupId>
<artifactId>log-collector</artifactId>
<dependencies>
<!--阿里巴巴开源json解析框架-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!--日志生成框架-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!--如果不配置,则不会引进父pom中的依赖-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-classic</artifactId>-->
<!-- </dependency>-->
</dependencies>
<build>
<plugins>
<!--自定义Maven项目编译器compiler插件相关配置-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<!--自定义Maven项目汇编assembly插件相关配置-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!--此处设置成主类的全名-->
<mainClass>com.tomandersen.appclient.AppMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
三、重复依赖,依赖冲突
由于一些dependency中包含了某个jar,然后我们又导入了其他jar,不知不觉中造成jar冲突,或者是重复依赖……这样整个项目的jar就会越来越冗余,庞大
方法一:把父pom依赖的jar包排除掉
-
如何查看依赖树图
-
放大后,会看到一些红线,这就是冲突的jar。一般选择低版本的depedency,点击右键——Exclude
去除了冲突或者重复的jar,maven会在对应pom的depedency中加 <exclusions>用于去掉某个依赖里的jar。
方法一:把父pom依赖的jar包覆盖掉
举例:
假如我们在项目pom中引入一个统一的依赖管理项目。
在common-base中引入了
但是我们想在datasource中使用最新版本的依赖,可以直接在datasource的pom中指定版本。
这样就可以使用最新的版本了。
但是,在依赖树图中,我们会看到又多了一条红线。也就意味着可能存在冲突。
重点、重点、重点、
########################################
产生冲突的原因,是因为根据 maven依赖最短路径原则,必然是产生了两个 相同路径长度 的依赖,版本不一致导致的。
########################################
强调一下,树图的红线并不影响项目的正常运行和打包,maven打包时会按照最短路径把需要的jar打包。
所以,只要再定义一个更短路径的依赖就可以解决。
比如我打的包时start,只要在start模块的pom中再引入一次依赖,就可以解决冲突ClassNotFoundException的问题。