我正在尝试使用eclipse中的Processing库构建一个程序。这个过程应该相对简单,但我甚至无法编译一个空的处理程序。我认为问题可能与我的课程路径有关,我不确定。我试图导入处理库并在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并重新安装了它,但它并没有什么区别。对此问题的任何帮助将不胜感激,我似乎无法在网上找到其他任何完全相同的问题。
答案 0 :(得分:4)
升级到JDK 9之后我遇到了完全相同的问题。我在这里报告了它是一个问题(https://github.com/processing/processing/issues/5371),并收到确认处理3与v9不兼容的确认。目前,唯一的解决方法是降级到v8。
答案 1 :(得分:1)
我在Mac上使用eclipse项目时遇到了完全相同的问题。 但是处理应用程序本身就可以编译。 因此,我在处理应用程序内容时进行了查找,找到了它使用的jdk(位于Processing / Contents / Plugins /中) 因此,我将其用作我的项目的jdk并成功了!
(我还安装了core.jar内容(由Keka打开)中指定的必需库(opengl的库))
答案 2 :(得分:0)
我甚至无法编译空处理程序。
这不是编译器错误。这是运行时错误。
无论如何,就像chrylis mentioned一样,这是因为你的类路径不正确。你如何解决这个问题取决于你正在使用哪个IDE,但是在eclipse中你可以右键单击你的项目,然后点击属性,然后转到左边的Java Build Path
部分。然后转到Libraries
标签并添加Processing jars。
我的猜测是你添加了core.jar
,这就是编译代码所需的全部内容。但是,既然你在Mac上运行,你也需要Mac专用的jar。您必须查看Processing安装目录。对不起,我不能更具体,但我没有Mac。
答案 3 :(得分:0)
java.lang.NoClassDefFoundError: com/apple/eawt/QuitHandler
Means Processing 不能再使用内部的 MacOS API,所以我在 Processing 论坛上找到了,为我解决了问题。
<块引用>经过深入研究,我发现 Mac 内部的 API 处理已被滥用以添加适当的退出处理程序并设置 停靠栏图标现已被移除并由官方 AWT APIS 取代。 Processing 中有一个名为 ThinkDifferent 的类,它是 当检测到 Mac 并且这个类正在调用时通过反射加载 现在删除的 API。为了解决这个问题,我使用重新实现了这个类 新的官方 API 并刚刚添加了一个新的 processing.core.Think 与我的项目不同的类解决了 问题。
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);
}
}