使用libsdl4j的Maven项目在Eclipse中运行报NoClassDefFoundError求助
解决libsdl4j-2.28.4-1.6的NoClassDefFoundError问题
问题重现
在Eclipse中运行基于Maven的Java项目,使用libsdl4j-2.28.4-1.6时触发NoClassDefFoundError,提示无法找到com/sun/jna/NativeLibrary类,错误栈如下:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/NativeLibrary at io.github.libsdl4j.jna.SdlNativeLibraryLoader.loadLibSDL2(SdlNativeLibraryLoader.java:33) at io.github.libsdl4j.jna.SdlNativeLibraryLoader.registerNativeMethods(SdlNativeLibraryLoader.java:24) at io.github.libsdl4j.api.Sdl$InternalNativeFunctions.<clinit>(Sdl.java:56) at io.github.libsdl4j.api.Sdl.SDL_Init(Sdl.java:30) at Demo.main(Demo.java:23) Caused by: java.lang.ClassNotFoundException: com.sun.jna.NativeLibrary at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
相关代码
触发错误的SdlNativeLibraryLoader类代码:
package io.github.libsdl4j.jna; import java.util.HashMap; import java.util.Map; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLibrary; import static com.sun.jna.Library.OPTION_CLASSLOADER; import static com.sun.jna.Library.OPTION_STRING_ENCODING; public final class SdlNativeLibraryLoader { public static final String SDL_LIBRARY_NAME = "SDL2"; // This field keeps the reference to the loaded JNA library object to prevent it from being garbage collected. private static NativeLibrary libSDL2; private SdlNativeLibraryLoader() { } public static synchronized void registerNativeMethods(Class<?> nativeClass) { if (libSDL2 == null) { libSDL2 = loadLibSDL2(); } Native.register(nativeClass, libSDL2); } private static NativeLibrary loadLibSDL2() { Map<String, Object> options = new HashMap<>(); options.put(OPTION_STRING_ENCODING, "UTF-8"); options.put(OPTION_CLASSLOADER, SdlNativeLibraryLoader.class.getClassLoader()); return NativeLibrary.getInstance(SDL_LIBRARY_NAME, options); } public static <T extends Library> T loadLibSDL2InterfaceInstance(Class<T> libraryInterface) { Map<String, Object> options = new HashMap<>(); options.put(OPTION_STRING_ENCODING, "UTF-8"); options.put(OPTION_CLASSLOADER, SdlNativeLibraryLoader.class.getClassLoader()); return Native.load(SDL_LIBRARY_NAME, libraryInterface, options); } }
项目配置
项目POM.xml
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>SDL4JDemo</groupId> <artifactId>JavaDemo</artifactId> <version>0.0.1-INSTALL{guice.disable.misplaced.annotation.check}</version> <name>Demo</name> <build> <defaultGoal>install</defaultGoal> </build> </project>
libsdl4j-2.28.4-1.6.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>io.github.libsdl4j</groupId> <artifactId>libsdl4j</artifactId> <version>2.28.4-1.6</version> <packaging>jar</packaging> <name>LibSDL4J</name> <description>LibSDL4J - Java language bindings for SDL2.</description> <url>https://libsdl4j.github.io/</url> <licenses> <license> <name>zlib License</name> <url>https://opensource.org/licenses/Zlib</url> </license> </licenses> <developers> <developer> <name>Kamil Ševeček</name> <url>https://github.com/shinedeveloper</url> <email>libsdl4j@outlook.com</email> </developer> </developers> <scm> <connection>scm:git:git://github.com/libsdl4j/libsdl4j.git</connection> <developerConnection>scm:git:ssh://github.com:libsdl4j/libsdl4j.git</developerConnection> <url>https://github.com/libsdl4j/libsdl4j/tree/master</url> </scm> <dependencies> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.15.0</version> </dependency> <dependency> <groupId>org.jetbrains</groupId> <artifactId>annotations</artifactId> <version>23.0.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> </dependencies> </project>
已尝试操作
- 删除
module-info.java,问题未解决 - 关闭Eclipse的Java Builder,仅保留Maven Project Builder,问题依旧
解决方案
1. 完善项目POM依赖
当前项目的POM未引入libsdl4j依赖,导致Maven无法自动拉取其依赖的JNA等库。修改项目的pom.xml,添加libsdl4j的依赖配置:
<project ...> <!-- 原有配置保留 --> <dependencies> <dependency> <groupId>io.github.libsdl4j</groupId> <artifactId>libsdl4j</artifactId> <version>2.28.4-1.6</version> </dependency> </dependencies> </project>
2. 更新Maven依赖
在Eclipse中右键项目,选择Maven -> Update Project,勾选Force Update of Snapshots/Releases选项后点击OK,让Maven重新下载并构建依赖。
3. 验证运行类路径
打开Run Configurations,找到你的Demo运行配置,切换到Classpath标签,确认jna-5.15.0.jar已经出现在User Entries或Maven Dependencies下。如果缺失,手动添加该JAR包(或重新执行步骤2)。
内容的提问来源于stack exchange,提问作者GuyD
相关产品推荐
相关产品推荐

