Minecraft 1.18.2模组运行报java.lang.ClassNotFoundException求助
问题:Minecraft 1.18.2模组加入世界后服务器崩溃,出现ClassNotFoundException: com.mysql.cj.exceptions.CJException
我正在开发Minecraft 1.18.2版本的模组,构建过程无报错,但尝试加入游戏世界后,控制台出现错误信息,服务器几秒后随即崩溃。我使用IntelliJ进行开发,服务器由Minestrator托管,以下是报错日志和build.gradle配置:
报错日志
[16:15:02] [ForkJoinPool.commonPool-worker-8/ERROR] [ne.mi.ev.EventSubclassTransformer/EVENTBUS]: Could not find parent com/mysql/cj/exceptions/CJException for class com/mysql/cj/exceptions/InvalidConnectionAttributeException in classloader jdk.internal.loader.ClassLoaders$AppClassLoader@5a07e868 on thread Thread[ForkJoinPool.commonPool-worker-8,8,SERVER] [16:15:02] [ForkJoinPool.commonPool-worker-8/ERROR] [ne.mi.ev.EventSubclassTransformer/EVENTBUS]: An error occurred building event handler java.lang.ClassNotFoundException: com.mysql.cj.exceptions.CJException at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?] {} at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?] {} at java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[?:?] {} at net.minecraftforge.eventbus.EventSubclassTransformer.buildEvents(EventSubclassTransformer.java:62) ~[eventbus-5.0.3.jar%232!/:?] {} at net.minecraftforge.eventbus.EventSubclassTransformer.transform(EventSubclassTransformer.java:44) ~[eventbus-5.0.3.jar%232!/:?] {} at net.minecraftforge.eventbus.EventBusEngine.processClass(EventBusEngine.java:21) ~[eventbus-5.0.3.jar%232!/:?] {} at net.minecraftforge.eventbus.service.ModLauncherService.processClassWithFlags(ModLauncherService.java:20) ~[eventbus-5.0.3.jar%232!/:5.0.3+70+master.d7d405b] {} at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-9.1.3.jar%235!/:?] {} at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-9.1.3.jar%235!/:?] {} at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-9.1.3.jar%235!/:?] {} at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-1.0.8.jar:?] {} at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-1.0.8.jar:?] {} at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-1.0.8.jar:?] {} at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-1.0.8.jar:?] {} at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135) ~[securejarhandler-1.0.8.jar:?] {} at java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[?:?] {} at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:176) ~[?:?] {re:classloading} at java.sql.DriverManager.getConnection(DriverManager.java:681) ~[java.sql:?] {} at java.sql.DriverManager.getConnection(DriverManager.java:229) ~[java.sql:?] {} at com.industrialrevolution.industrialmod.utils.Database.connect(Database.java:20) ~[?:?] {re:classloading} at com.industrialrevolution.industrialmod.utils.Database.lambda$getPlayerUUID$4(Database.java:119) ~[?:?] {re:classloading} at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) [?:?] {} at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760) [?:?] {} at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) [?:?] {} at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) [?:?] {} at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) [?:?] {re:computing_frames} at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) [?:?] {re:computing_frames} at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) [?:?] {}
build.gradle配置
plugins { id 'eclipse' id 'idea' id 'net.minecraftforge.gradle' version '[6.0,6.2)' } group = mod_version version = mod_group_id base { archivesName = mod_id } java { toolchain.languageVersion = JavaLanguageVersion.of(17) } jarJar.enable() tasks.jarJar.configure { } minecraft { mappings channel: "official", version: minecraft_version copyIdeResources = true runs { configureEach { workingDirectory project.file('run') property 'forge.logging.markers', 'REGISTRIES' property 'forge.logging.console.level', 'debug' mods { "${mod_id}" { source sourceSets.main } } } client { property 'forge.enabledGameTestNamespaces', mod_id } server { property 'forge.enabledGameTestNamespaces', mod_id args '--nogui' } gameTestServer { property 'forge.enabledGameTestNamespaces', mod_id } data { workingDirectory project.file('run-data') args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') } } } sourceSets.main.resources { srcDir 'src/generated/resources' } repositories { maven { url = 'https://maven.tterrag.com/' } maven { url = "https://dvs1.progwml6.com/files/maven/" } maven { url = "https://modmaven.dev" } maven { url 'https://jitpack.io' } maven { url 'https://cursemaven.com' } } dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" implementation fg.deobf("com.simibubi.create:create-${minecraft_version}:${create_version}:slim") { transitive = false } implementation fg.deobf("com.jozufozu.flywheel:flywheel-forge-${minecraft_version}:${flywheel_version}") implementation fg.deobf("com.tterrag.registrate:Registrate:MC${minecraft_version}-${registrate_version}") compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}:api") runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") runtimeOnly "curse.maven:mysql-jdbc-561280:4684944" } tasks.named('processResources', ProcessResources).configure { var replaceProperties = [ minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range, forge_version: forge_version, forge_version_range: forge_version_range, loader_version_range: forge_version_range, mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, mod_authors: mod_authors, mod_description: mod_description, ] inputs.properties replaceProperties filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { expand replaceProperties + [project: project] } } tasks.named('jar', Jar).configure { manifest { attributes([ "Specification-Title": mod_id, "Specification-Vendor": mod_authors, "Specification-Version": "1", "Implementation-Title": project.name, "Implementation-Version": project.jar.archiveVersion, "Implementation-Vendor": mod_authors, "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } finalizedBy 'reobfJar' } tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' }
解决方案
核心问题是MySQL JDBC驱动的依赖配置错误,导致运行时无法找到com.mysql.cj.exceptions.CJException类。
修正依赖配置
将当前的MySQL JDBC依赖从runtimeOnly改为implementation,并添加fg.deobf()处理——Forge模组需要对第三方库进行反混淆才能正常加载:implementation fg.deobf("curse.maven:mysql-jdbc-561280:4684944")也可以直接使用Maven中央仓库的官方驱动,稳定性更高:
implementation fg.deobf("mysql:mysql-connector-java:8.0.33")配置JarJar打包驱动
你的build.gradle启用了jarJar.enable()但未配置,需要让JarJar将MySQL驱动打包到模组Jar中,避免服务器缺少依赖。修改tasks.jarJar.configure块:tasks.jarJar.configure { from configurations.runtimeClasspath include "com/mysql/**" }重新构建部署
执行gradlew clean build清理旧构建文件并重新打包模组,然后将build/libs目录下生成的Jar文件上传到Minestrator服务器替换旧文件。验证数据库连接代码
确认Database.connect()方法中的MySQL连接字符串、用户名、密码正确,同时检查服务器防火墙是否允许模组连接到MySQL数据库。
内容的提问来源于stack exchange,提问作者tortuedu77
相关产品推荐
相关产品推荐

