大数据 Guava冲突问题

本文介绍如何解决Guava与Hadoop/HBase等大数据组件之间的包冲突问题,通过使用Maven Shade Plugin单独构建并重命名Guava jar包,确保项目能够正常运行。

程序使用的guava版本和hadoop hbase大数据之类的包冲突,总是报NoSuchMethod和ClassNoDef之类的错误

解决方法:将依赖的guava-xx.0单独打成jar包,并改名,再重新放回源程序

基于maven-shade-plugin,guava单独打成jar包,修改包路径,并加入源程序的maven本地仓库
1.guava单独打成jar包的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.data.guava</groupId>
    <artifactId>my-guava</artifactId>
    <version>1.0</version>
 
<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>22.0</version>
    </dependency>
</dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>com.google.guava</pattern>
                                    <shadedPattern>my.guava</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>com.google.common</pattern>
                                    <shadedPattern>my.guava.common</shadedPattern>
                                </relocation>
                            </relocations>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
 
</project>





2 install 到本地

mvn install:install-file -Dfile=target/guava-1.0.jar -DgroupId=com.data.guava -DartifactId=my-guava  -Dversion=1.0 -Dpackaging=jar

3.程序中引入


<dependency>
      <groupId>com.data.guava</groupId>
      <artifactId>my-guava</artifactId>
      <version>1.0</version>
    </dependency>

4.修改包路径

//import com.google.common.base.Charsets;
//import com.google.common.hash.BloomFilter;
//import com.google.common.hash.Funnel;
//import com.google.common.hash.PrimitiveSink;
 
import com.data.guava.common.hash.BloomFilter;
import com.data.guava.common.hash.Funnels;

<think>嗯,用户问的是com.google.guava会被哪些包间接引用。首先,我需要确定用户为什么会关心这个问题。可能他们在安全扫描中发现Guava有漏洞,但自己没有直接引用,所以想找出是哪个依赖引入了它。或者他们可能在依赖树中看到Guava,但不确定来源。 接下来,我需要回忆常见的依赖库,特别是那些常用且可能依赖Guava的。比如Google自己的库,比如gRPC、Firebase、Google Cloud客户端库,这些很可能依赖Guava。还有Apache的项目,比如Beam、Camel、Kafka,这些大数据或中间件框架常用Guava作为基础库。 另外,Spring生态中的某些项目,比如Spring Cloud GCP,可能也会间接引用Guava。测试框架比如Mockito或PowerMock,还有序列化库比如Protobuf或Jackson也可能依赖Guava。 用户可能需要一步步排查的方法,比如使用Maven的dependency:tree或者Gradle的dependencies任务来查找传递依赖。同时,要提醒用户注意版本问题,不同版本的依赖可能引入不同版本的Guava,而有些版本可能存在漏洞。 还要考虑用户可能的误区,比如某些库可能已经更新了Guava的版本,或者排除了Guava,但用户的项目可能还在使用旧版本。这时候需要指导用户如何排除传递依赖。 最后,要确保回答结构清晰,分点列出常见的间接引用来源,并提供排查方法,这样用户能一步步解决问题。同时,要提醒用户即使不直接引用,安全漏洞仍然需要处理,建议使用依赖分析工具持续监控。</think>以下是**com.google.guava**常见的间接引用场景及依赖来源分析: --- ### **一、常见间接引用场景** Guava作为Java基础工具库,被许多主流框架和组件**隐式依赖**,典型场景包括: | **依赖类型** | **典型框架/库** | **依赖路径示例** | |----------------------|-------------------------------------------------------------------------------|--------------------------------------------------| | **Google生态库** | gRPC、Google Cloud客户端库、Firebase SDK、Protocol Buffers(protobuf-java) | `grpc-core -> guava` | | **大数据框架** | Apache Beam、Apache Camel、Apache Kafka、HBase | `kafka-clients -> guava` | | **测试工具** | Mockito、PowerMock、JUnit 5(部分扩展) | `mockito-core -> guava` | | **序列化/配置库** | Jackson(某些扩展)、SnakeYAML、HikariCP | `jackson-databind -> guava` | | **Spring生态** | Spring Cloud GCP、Spring Boot某些Starter(如Spring Session) | `spring-cloud-gcp-starter -> google-api-client -> guava` | | **构建工具插件** | Maven/Gradle插件(如Android构建工具、Checkstyle插件等) | `android-maven-plugin -> guava` | --- ### **二、依赖排查方法** #### **1. Maven项目** 通过依赖树分析具体引入路径: ```bash mvn dependency:tree -Dincludes=com.google.guava ``` 输出示例: ``` [INFO] com.example:demo:jar:1.0.0 └─┬ org.apache.beam:beam-sdks-java-core:2.50.0 └── com.google.guava:guava:32.1.3-jre ``` #### **2. Gradle项目** 使用`dependencies`任务过滤: ```bash gradle dependencies --configuration runtimeClasspath | grep 'com.google.guava' ``` --- ### **三、高频间接依赖示例** #### **1. Google Cloud客户端库** - **依赖路径**: `google-cloud-storage -> google-cloud-core -> guava` - **典型版本**: Google Cloud客户端库通常依赖Guava 32.x+,但旧版本可能引入漏洞版本(如Guava <32.0)。 #### **2. Apache Beam** - **依赖路径**: `beam-sdks-java-core -> guava` - **版本冲突风险**: Beam 2.50.0默认依赖Guava 32.1.3-jre,可能与项目中其他库的Guava版本冲突。 #### **3. gRPC** - **依赖路径**: `grpc-core -> guava` - **典型问题**: gRPC 1.56+要求Guava >=32.0,但旧版本gRPC可能依赖Guava <32.0(存在CVE漏洞)。 --- ### **四、解决方案** 1. **强制版本统一** 在Maven/Gradle中显式声明Guava版本,覆盖传递依赖: ```xml <!-- Maven --> <dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>33.0.0-jre</version> <!-- 使用安全版本 --> </dependency> </dependencies> </dependencyManagement> ``` 2. **排除特定依赖** 针对间接引入Guava的库,手动排除: ```xml <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-sdks-java-core</artifactId> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **使用依赖分析工具** 通过工具(如`mvn dependency:analyze`或Gradle的`dependencyInsight`)定位冲突源头。 --- ### **五、安全建议** - **Guava高危漏洞版本**: 避免使用Guava <32.0(存在反序列化漏洞CVE-2023-2976等)。 - **持续监控**: 集成OWASP Dependency-Check或GitHub Dependabot,自动检测依赖链风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值