在 Java 中使用外部库

  • 本文关键字:外部 Java java ant native
  • 更新时间 :
  • 英文 :


这是我在运行时不断遇到的错误:

[java] Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException

请注意,这是运行时错误,而不是编译时错误。我的构建中的两个任务.xml都设置了相同的类路径,并且编译任务每次都运行良好:

<path id="classpath">
    <fileset dir="lib" includes="*.jar" />
</path>
<target name="compile">
    <mkdir dir="build/classes"/>
    <javac
        srcdir="src"
        classpathref="classpath"
        includeantruntime="false"
        destdir="build/classes"
    />
</target>
...
<target name="run" depends="clean,compile,jar">
    <java
        jar="build/jar/${project.name}.jar"
        fork="true"
        classpathref="classpath"
        >
        <sysproperty key="java.library.path" path="${path.lib}/windows"/>
    </java>
</target>

尝试通过命令行手动运行 jar 会产生相同的结果:

java -cp .:lib/*.jar -Djava.library.path=lib/windows -jar build/jar/JUtopia.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException

请注意,库 jarfile 没问题:

bash-3.1$ jar -tf lib/lwjgl.jar | grep LWJGLException
org/lwjgl/LWJGLException.class

并且本机库已到位:

bash-3.1$ ls lib/windows/lwjgl.dll
lib/windows/lwjgl.dll
问题

:我哪里出了问题?我已经在这个问题上打了将近 3 天了。任何帮助将不胜感激。

完整结果堆栈:

clean:
   [delete] Deleting directory C:UsersmkumpanProjectsJUtopiabuild
compile:
    [mkdir] Created dir: C:UsersmkumpanProjectsJUtopiabuildclasses
    [javac] Compiling 12 source files to C:UsersmkumpanProjectsJUtopiabuildclasses
jar:
    [mkdir] Created dir: C:UsersmkumpanProjectsJUtopiabuildjar
      [jar] Building jar: C:UsersmkumpanProjectsJUtopiabuildjarJUtopia.jar
run:
     [java] Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException
     [java]     at JUtopia.<init>(Unknown Source)
     [java]     at JUtopia.main(Unknown Source)
     [java] Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException
     [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
     [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
     [java]     at java.security.AccessController.doPrivileged(Native Method)
     [java]     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
     [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
     [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
     [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
     [java]     ... 2 more

PS:请注意,我在Windows环境中使用带有bash的Console2进行命令行工作,因此Windows本机尚未使用linux shell语法。使用香草cmd运行罐子会产生相同的结果。

-jar...

When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored. - 参考

资料

尝试在 JAR 中设置类路径

或者尝试在没有 -Jar 选项的情况下运行,方法是在命令行上指定主类

其中一个可能的原因是,在加载类 LWJGLException 时,它还引用了在类路径上找不到的另一个类。因此,报告的错误有时不清楚。

重要的是你有这个NoClassDefFoundError而不是ClassNotFoundException,这是你假设你遇到的错误:它找不到类LWHLException,是的,它可以!但它不能加载它。

相关内容

  • 没有找到相关文章

最新更新