You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决GraphHopper v10.0与项目的Protobuf版本冲突?

解决Protobuf 3.x与4.x版本共存的简单依赖隔离方案

针对你遇到的GraphHopper v10.0依赖Protobuf 3.x、其他模块需用4.x的冲突问题,最可靠且无需复杂类加载技术的方案是通过Maven Shade插件重命名Protobuf 3.x的包路径,实现两个版本的类隔离。以下是具体步骤:

1. 创建独立的GraphHopper隔离模块

新建一个Maven模块,专门用于封装GraphHopper v10.0及其依赖的Protobuf 3.x:

  • 在该模块的pom.xml中引入GraphHopper核心依赖,并排除所有外部的Protobuf依赖,确保只引入3.x版本:
<dependencies>
  <dependency>
    <groupId>com.graphhopper</groupId>
    <artifactId>graphhopper-core</artifactId>
    <version>10.0</version>
    <exclusions>
      <exclusion>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <!-- 手动引入指定版本的Protobuf 3.x -->
  <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.25.3</version> <!-- 替换为GraphHopper兼容的3.x版本 -->
  </dependency>
</dependencies>

2. 配置Maven Shade插件重命名Protobuf包

在隔离模块的pom.xml中添加Shade插件,将Protobuf 3.x的所有类重命名到新的包路径(比如com.google.protobuf.v3),避免与4.x版本的包名冲突:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.5.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <!-- 重命名Protobuf 3.x的包 -->
            <relocations>
              <relocation>
                <pattern>com.google.protobuf</pattern>
                <shadedPattern>com.google.protobuf.v3</shadedPattern>
              </relocation>
            </relocations>
            <!-- 指定需要打包的依赖 -->
            <artifactSet>
              <includes>
                <include>com.graphhopper:graphhopper-core</include>
                <include>com.google.protobuf:protobuf-java</include>
              </includes>
            </artifactSet>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

3. 主项目依赖隔离后的GraphHopper模块

在主项目的pom.xml中,移除原来的GraphHopper和Protobuf 3.x依赖,改为依赖你刚打包好的隔离模块:

<dependencies>
  <!-- 依赖隔离后的GraphHopper模块 -->
  <dependency>
    <groupId>your.group.id</groupId>
    <artifactId>graphhopper-isolated</artifactId>
    <version>1.0.0</version>
  </dependency>
  <!-- 其他模块正常引入Protobuf 4.x -->
  <dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>4.25.3</version>
  </dependency>
</dependencies>

为什么之前的dependencyManagement排除无效?

因为GraphHopper直接依赖Protobuf的类,单纯排除会导致GraphHopper找不到所需类;同时,Maven的默认类路径是全局共享的,即使排除,其他模块引入的Protobuf 4.x仍会被加载,导致GraphHopper调用时加载到错误版本的类。Shade插件通过重命名包路径,让GraphHopper使用完全独立的Protobuf 3.x类,从根本上避免冲突。

验证方案有效性

  • 编译并打包隔离模块,检查生成的jar包中是否包含com.google.protobuf.v3路径下的类。
  • 运行主项目,分别测试GraphHopper的功能和其他模块基于Protobuf 4.x的功能,确认无类加载错误。

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:50:03