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
相关产品推荐
相关产品推荐

