将Processing库导入eclipse时无法编译

问题描述 投票:0回答:5

我正在尝试使用 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并重新安装了它,但没有什么区别。对于这个问题的任何帮助将不胜感激,我似乎无法在网上找到任何其他人有完全相同的问题。

java eclipse compiler-errors processing
5个回答
6
投票

升级到 JDK 9 后,我遇到了完全相同的问题。我在此处将其报告为问题(https://github.com/processing/processing/issues/5371),并收到了处理 3 与 v9 不兼容的确认信息。目前,唯一的解决方法是降级到 v8。


2
投票
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);
  }
}

1
投票

我在 Mac 上的 eclipse 项目中遇到了完全相同的问题。 但处理应用程序本身编译得很好。 所以我在处理应用程序内容中查找并找到了它使用的jdk(位于Processing/Contents/Plugins/) 所以我用它作为我的项目的jdk并且它工作了!

(我还安装了 core.jar 内容中指定的所需库(opengl 库)(用 Keka 打开))


0
投票

我什至无法编译一个空的处理程序。

这不是编译器错误。这是一个运行时错误。

无论如何,就像chrylis提到的,这是因为你的类路径不正确。如何修复此问题取决于您使用的 IDE,但在 Eclipse 中,您可以右键单击您的项目,然后单击属性,然后转到左侧的

Java Build Path
部分。然后转到
Libraries
选项卡并添加处理罐子。

我的猜测是您已经添加了

core.jar
,这就是编译代码所需的全部内容。但由于您在 Mac 上运行,因此您还需要 Mac 特定的 jar。您必须查看您的处理安装目录。抱歉,我不能更具体,但我没有 Mac。


0
投票

我在 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.");
    }
© www.soinside.com 2019 - 2024. All rights reserved.