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

Spigot插件启动报错:io.netty.handler.codec.http2方法缺失

Spigot插件连接Firestore启动报错:NoSuchMethodError(Netty版本冲突)

启动插件时抛出以下错误:

[Channel<1>: (firestore.googleapis.com:443)] Uncaught exception in the SynchronizationContext. Panic!
java.lang.NoSuchMethodError: io.netty.handler.codec.http2.DefaultHttp2HeadersEncoder.<init>(Lio/netty/handler/codec/http2/Http2HeadersEncoder$SensitivityDetector;ZII)V
        at io.grpc.netty.NettyClientHandler.newHandler(NettyClientHandler.java:155) ~[?:?]
        at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:221) ~[?:?]
        at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:34) ~[?:?]
        at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:34) ~[?:?]
        at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:259) ~[?:?]
        at io.grpc.internal.InternalSubchannel.access$400(InternalSubchannel.java:66) ~[?:?]
        at io.grpc.internal.InternalSubchannel$2.run(InternalSubchannel.java:201) ~[?:?]
        at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:94) ~[?:?]
        at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:126) ~[?:?]
        at io.grpc.internal.ManagedChannelImpl$NameResolverListener.onResult(ManagedChannelImpl.java:1886) ~[?:?]
        at io.grpc.internal.RetryingNameResolver$RetryingListener.onResult(RetryingNameResolver.java:98) ~[?:?]
        at io.grpc.internal.DnsNameResolver$Resolve.run(DnsNameResolver.java:333) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
        at java.lang.Thread.run(Thread.java:834) ~[?:?]

当前pom.xml关键配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>ren.yololaxe.rbfirebaseauth.main</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <!-- Dépendance pour gRPC -->
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-core</artifactId>
        <version>1.60.0</version>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty</artifactId>
        <version>1.60.0</version>
    </dependency>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>5.0.0.Alpha1</version>
    </dependency>

    <!-- Dépendance pour Guava -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>31.1-jre</version> <!-- Utilisez la version compatible -->
    </dependency>

    <!-- Dépendance pour Firebase Admin SDK -->
    <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>9.2.0</version> <!-- Utilisez la version compatible -->
    </dependency>
    <!-- Dépendance pour Paper API -->
    <dependency>
        <groupId>com.destroystokyo.paper</groupId>
        <artifactId>paper-api</artifactId>
        <version>1.16.5-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

解决方案

1. 移除手动引入的netty-all依赖

grpc-netty和Firebase Admin SDK已经自带兼容的稳定版Netty,手动引入的5.0.0.Alpha1是预览版,和gRPC 1.60.0的依赖版本不匹配,直接删除该依赖节点即可。

2. 统一gRPC与Firebase的版本兼容性

Firebase Admin SDK 9.2.0依赖的gRPC版本为1.48.x,将gRPC相关依赖版本调整为1.48.1:

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-core</artifactId>
    <version>1.48.1</version>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty</artifactId>
    <version>1.48.1</version>
</dependency>

3. 配置Shade插件的包重定位(关键)

Spigot/Paper服务器本身自带Netty,必须将插件依赖的Netty、gRPC类重命名到自定义包下,避免类加载冲突。修改shade插件的<configuration>部分:

<configuration>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
            </excludes>
        </filter>
    </filters>
    <relocations>
        <!-- 重定位Netty包 -->
        <relocation>
            <pattern>io.netty</pattern>
            <shadedPattern>ren.yololaxe.rbfirebaseauth.lib.io.netty</shadedPattern>
        </relocation>
        <!-- 重定位gRPC包 -->
        <relocation>
            <pattern>io.grpc</pattern>
            <shadedPattern>ren.yololaxe.rbfirebaseauth.lib.io.grpc</shadedPattern>
        </relocation>
        <!-- 重定位Guava包(可选,避免和服务器Guava冲突) -->
        <relocation>
            <pattern>com.google.common</pattern>
            <shadedPattern>ren.yololaxe.rbfirebaseauth.lib.com.google.common</shadedPattern>
        </relocation>
    </relocations>
    <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>ren.yololaxe.rbfirebaseauth.main</mainClass>
        </transformer>
    </transformers>
</configuration>

原理说明

报错核心是Netty版本冲突:

  • 手动引入的Netty 5.0预览版与gRPC依赖的Netty版本不兼容,导致DefaultHttp2HeadersEncoder构造方法签名不匹配;
  • Spigot服务器自带的Netty与插件依赖的Netty类路径冲突,运行时加载了服务器的旧版本Netty类,而该类没有gRPC需要的构造方法。

通过移除手动Netty依赖、统一版本、包重定位三步,即可彻底解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:17:05