前言
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>
<dependencyManagement>
<dependencies>
<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>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
</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中统一管理,不用指定版本。指定版本,则覆盖父类配置信息
代码如下(示例):
<parent>
<artifactId>HadoopCustomModules</artifactId>
<groupId>com.tomandersen</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tomandersen</groupId>
<artifactId>log-collector</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<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的问题。
|