我正在尝试使用 Eclipse 中的处理库构建一个程序。这个过程应该相对简单,但我什至无法编译一个空的处理程序。我认为问题可能与我的类路径有关,我不确定。我曾多次尝试导入处理库并在 Eclipse 和 IntelliJ 上编写简单的程序,但没有成功。
这是程序:
import processing.core.PApplet;
public class Processing extends PApplet {
public static void main(String[] args) {
PApplet.main("Processing", args);
}
}
这些是我得到的错误:
java.lang.NoClassDefFoundError: com/apple/eawt/QuitHandler
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3139)
at java.base/java.lang.Class.getMethodsRecursive(Class.java:3280)
at java.base/java.lang.Class.getMethod0(Class.java:3266)
at java.base/java.lang.Class.getMethod(Class.java:2063)
at processing.core.PApplet.runSketch(PApplet.java:10716)
at processing.core.PApplet.main(PApplet.java:10513)
at Processing.main(Processing.java:6)
Caused by: java.lang.ClassNotFoundException: com.apple.eawt.QuitHandler
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 8 more
我已经卸载了java JDK并重新安装了它,但没有什么区别。对于这个问题的任何帮助将不胜感激,我似乎无法在网上找到任何其他人有完全相同的问题。
升级到 JDK 9 后,我遇到了完全相同的问题。我在此处将其报告为问题(https://github.com/processing/processing/issues/5371),并收到了处理 3 与 v9 不兼容的确认信息。目前,唯一的解决方法是降级到 v8。
java.lang.NoClassDefFoundError: com/apple/eawt/QuitHandler
意味着Processing无法再使用内部MacOS API,所以我在Processing论坛上找到了,为我解决了问题。
经过深入研究,我发现内部 Mac API 处理已被滥用来添加适当的退出处理程序并设置 停靠栏图标现已删除并由官方 AWT APIS 取代。 在Processing中有一个类叫做ThinkDifferent,它是 当检测到 Mac 并且此类正在调用时通过反射加载 现在已删除的 API。为了解决这个问题,我使用重新实现了这个类 新的官方 API 并刚刚添加了一个新的 我的项目的processing.core.ThinkDifferent类解决了 问题。
package processing.core;
import java.awt.Desktop;
import java.awt.Image;
import java.awt.Taskbar;
import java.awt.desktop.QuitEvent;
import java.awt.desktop.QuitHandler;
import java.awt.desktop.QuitResponse;
public class ThinkDifferent {
// True if user has tried to quit once. Prevents us from cancelling the quit
// call if the sketch is held up for some reason, like an exception that's
// managed to put the sketch in a bad state.
static boolean attemptedQuit;
public static void init(final PApplet sketch) {
Desktop desktop = Desktop.getDesktop();
desktop.setQuitHandler(
new QuitHandler() {
@Override
public void handleQuitRequestWith(QuitEvent e, QuitResponse response) {
sketch.exit();
if (PApplet.uncaughtThrowable == null && !attemptedQuit) {
response.cancelQuit();
attemptedQuit = true;
} else {
response.performQuit();
}
}
});
}
public static void cleanup() {
Desktop.getDesktop().setQuitHandler(null);
}
// Called via reflection from PSurfaceAWT and others
public static void setIconImage(Image image) {
Taskbar.getTaskbar().setIconImage(image);
}
}
我在 Mac 上的 eclipse 项目中遇到了完全相同的问题。 但处理应用程序本身编译得很好。 所以我在处理应用程序内容中查找并找到了它使用的jdk(位于Processing/Contents/Plugins/) 所以我用它作为我的项目的jdk并且它工作了!
(我还安装了 core.jar 内容中指定的所需库(opengl 库)(用 Keka 打开))
我什至无法编译一个空的处理程序。
这不是编译器错误。这是一个运行时错误。
无论如何,就像chrylis提到的,这是因为你的类路径不正确。如何修复此问题取决于您使用的 IDE,但在 Eclipse 中,您可以右键单击您的项目,然后单击属性,然后转到左侧的
Java Build Path
部分。然后转到 Libraries
选项卡并添加处理罐子。
我的猜测是您已经添加了
core.jar
,这就是编译代码所需的全部内容。但由于您在 Mac 上运行,因此您还需要 Mac 特定的 jar。您必须查看您的处理安装目录。抱歉,我不能更具体,但我没有 Mac。
我刚刚添加了以下代码块
try {
Class<?> quitHandlerClass = Class.forName("com.apple.eawt.QuitHandler");
//Call your main class here
} catch (ClassNotFoundException e) {
System.out.println("Not a Mac OS X system, no need to handle quit event.");
}