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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:44:53