29

我在 Eclipse 中有一个项目,上面有一个红十字,不会导出到可运行的 JAR。我不记得自从我在笔记本电脑上重新安装 Windows 后是否看过它,但我知道我没有更改任何代码。任何类都没有错误,但是我得到的错误指向以下处理 Mac OSx 上的菜单项的类:

import java.lang.reflect.*;

public class osxhandler implements InvocationHandler {

    protected Object targetObject;
    protected Method targetMethod;
    protected String proxySignature;

    static Object macOSXApplication;

    // Pass this method an Object and Method equipped to perform application shutdown logic
    // The method passed should return a boolean stating whether or not the quit should occur
    public static void setQuitHandler(Object target, Method quitHandler) {
        setHandler(new HOsx("handleQuit", target, quitHandler));
    }


    public static void setAboutHandler(Object target, Method aboutHandler) {
        boolean enableAboutMenu = (target != null && aboutHandler != null);
        if (enableAboutMenu) {
            setHandler(new HOsx("handleAbout", target, aboutHandler));
        }
        // If we're setting a handler, enable the About menu item by calling
        // com.apple.eawt.Application reflectively
        try {
            Method enableAboutMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledAboutMenu", new Class[] { boolean.class });
            enableAboutMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enableAboutMenu) });
        } catch (Exception ex) {
            System.err.println("MacOSHandler could not access the About Menu");
            ex.printStackTrace();
        }
    }

       public static void setPreferencesHandler(Object target, Method prefsHandler) {
            boolean enablePrefsMenu = (target != null && prefsHandler != null);
            if (enablePrefsMenu) {
                setHandler(new HOsx("handlePreferences", target, prefsHandler));
            }
            // If we're setting a handler, enable the Preferences menu item by calling
            // com.apple.eawt.Application reflectively
            try {
                Method enablePrefsMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledPreferencesMenu", new Class[] { boolean.class });
                enablePrefsMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enablePrefsMenu) });
            } catch (Exception ex) {
                System.err.println("MacOSHandler could not access the About Menu");
                ex.printStackTrace();
            }
        }

        // Pass this method an Object and a Method equipped to handle document events from the Finder
        // Documents are registered with the Finder via the CFBundleDocumentTypes dictionary in the 
        // application bundle's Info.plist
        public static void setFileHandler(Object target, Method fileHandler) {
            setHandler(new HOsx("handleOpenFile", target, fileHandler) {
                // Override MacOSHandler.callTarget to send information on the
                // file to be opened
                public boolean callTarget(Object appleEvent) {
                    if (appleEvent != null) {
                        try {
                            Method getFilenameMethod = appleEvent.getClass().getDeclaredMethod("getFilename", (Class[])null);
                            String filename = (String) getFilenameMethod.invoke(appleEvent, (Object[])null);
                            this.targetMethod.invoke(this.targetObject, new Object[] { filename });
                        } catch (Exception ex) {

                        }
                    }
                    return true;
                }
            });
        }

        // setHandler creates a Proxy object from the passed MacOSHandler and adds it as an ApplicationListener
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void setHandler(HOsx adapter) {
            try {
                Class applicationClass = Class.forName("com.apple.eawt.Application");
                if (macOSXApplication == null) {
                    macOSXApplication = applicationClass.getConstructor((Class[])null).newInstance((Object[])null);
                }
                Class applicationListenerClass = Class.forName("com.apple.eawt.ApplicationListener");
                Method addListenerMethod = applicationClass.getDeclaredMethod("addApplicationListener", new Class[] { applicationListenerClass });
                // Create a proxy object around this handler that can be reflectively added as an Apple ApplicationListener
                Object MacOSHandlerProxy = Proxy.newProxyInstance(HOsx.class.getClassLoader(), new Class[] { applicationListenerClass }, adapter);
                addListenerMethod.invoke(macOSXApplication, new Object[] { MacOSHandlerProxy });
            } catch (ClassNotFoundException cnfe) {
                System.err.println("This version of Mac OS X does not support the Apple EAWT.  ApplicationEvent handling has been disabled (" + cnfe + ")");
            } catch (Exception ex) {  // Likely a NoSuchMethodException or an IllegalAccessException loading/invoking eawt.Application methods
                System.err.println("Mac OS X Adapter could not talk to EAWT:");
                ex.printStackTrace();
            }
        }

        // Each MacOSHandler has the name of the EAWT method it intends to listen for (handleAbout, for example),
        // the Object that will ultimately perform the task, and the Method to be called on that Object
        protected HOsx(String proxySignature, Object target, Method handler) {
            this.proxySignature = proxySignature;
            this.targetObject = target;
            this.targetMethod = handler;
        }

        // Override this method to perform any operations on the event 
        // that comes with the various callbacks
        // See setFileHandler above for an example
        public boolean callTarget(Object appleEvent) throws InvocationTargetException, IllegalAccessException {
            Object result = targetMethod.invoke(targetObject, (Object[])null);
            if (result == null) {
                return true;
            }
            return Boolean.valueOf(result.toString()).booleanValue();
        }

        // InvocationHandler implementation
        // This is the entry point for our proxy object; it is called every time an ApplicationListener method is invoked
        public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
            if (isCorrectMethod(method, args)) {
                boolean handled = callTarget(args[0]);
                setApplicationEventHandled(args[0], handled);
            }
            // All of the ApplicationListener methods are void; return null regardless of what happens
            return null;
        }

        // Compare the method that was called to the intended method when the MacOSHandler instance was created
        // (e.g. handleAbout, handleQuit, handleOpenFile, etc.)
        protected boolean isCorrectMethod(Method method, Object[] args) {
            return (targetMethod != null && proxySignature.equals(method.getName()) && args.length == 1);
        }

        // It is important to mark the ApplicationEvent as handled and cancel the default behavior
        // This method checks for a boolean result from the proxy method and sets the event accordingly
        protected void setApplicationEventHandled(Object event, boolean handled) {
            if (event != null) {
                try {
                    Method setHandledMethod = event.getClass().getDeclaredMethod("setHandled", new Class[] { boolean.class });
                    // If the target method returns a boolean, use that as a hint
                    setHandledMethod.invoke(event, new Object[] { Boolean.valueOf(handled) });
                } catch (Exception ex) {
                    System.err.println("MacOSHandler was unable to handle an ApplicationEvent: " + event);
                    ex.printStackTrace();
                }
            }
        }    
}

关于为什么我不能导出/编译的任何想法?我以前从来没有遇到过这个问题。

4

10 回答 10

37

只需对项目进行清理和/或重建。

您可以在ProjectEclipse 的菜单下找到它。

于 2013-08-18T15:52:51.770 回答
8

对于这个问题,我也有一个不同的、退化的案例。原来,我们的项目中有一个类,它有一个文件(所以 Eclipse 将它保存在类路径中)但文件中没有定义实际的类(文件只有导入和类注释......可能是合并出错了) . 无论如何,删除文件解决了这个问题。

于 2016-03-23T19:39:17.407 回答
4

Eclipse 总是在项目文件夹中生成隐藏文件 .project 和 .classpath 是相当可恨的。有时您不知道这些文件中是否有问题。

升级 Eclipse 后,如果发现以下编译错误,建议您检查项目文件夹中的 .classpath。

该项目未构建,因为其构建路径不完整。找不到 java.lang.Object 的类文件。修复构建路径,然后尝试构建此项目

你很可能会看到这样的一行。

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/    org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/j2re1.4.2_03"/>

愚蠢的 Eclipse 无缘无故地附加了这个。只需将其删除即可使其再次工作。;)

/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/j2re1.4.2_xx

来源:http ://hochit.com/2006/07/06/eclipse-upgrading-problem-javalangobject-not-found/

此外,您可以project settings在 Eclipse 中检查您的。右键单击您的项目并选择属性。转到Java Build Path,应该有更具体的问题信息。很可能您将 设置JDK为新系统上不存在的版本。

如果这也没有帮助,请选择您的项目,然后使用菜单项Source->Clean Up

于 2013-08-18T15:49:56.673 回答
1

在我的例子中,类是空的,编译器抱怨:

Class files on classpath not found or not accessible for: 'ibDemo/src/com/ib/controller/LocationCode.java'
Class files on classpath not found or not accessible for: 'ibDemo/src/com/ib/controller/PairPanel.java'

为了解决这个问题,我要添加一个类声明:

public class LocationCode
{

}

public class PairPanel
{

}
于 2016-11-02T09:54:28.703 回答
0

我也遇到了同样的错误。就我而言,问题是,我通过“用户库”多次放置同一个 jar,下一次通过同一项目的“构建路径”放置。刚刚从类路径中删除了重复的 jar 并解决了上述错误。

于 2015-02-26T06:34:18.993 回答
0

我被推荐到这里,因为我有同样的错误。我在eclipse上使用maven。我确实右键单击存储库,选择构建路径->配置构建->项目引用并检查了我的存储库的项目引用。这对我有用。

于 2015-02-13T22:09:28.340 回答
0

不确定这可能是最好的解决方案,但请检查 java 构建路径。我让它指向一个错误的位置,因为我面临着类未找到错误。修复 java 构建路径后,问题就解决了。

于 2017-10-12T10:45:25.813 回答
0

我在 Eclipse 中关闭了所有带有文件的选项卡,它已解决问题。

于 2020-09-30T04:43:47.553 回答
0

我遇到了同样的错误,在尝试了多个建议后,什么都没解决。所以我创建了一个新的工作区并参考了这个项目。之后,它成功构建并导出 JAR,没有错误。

于 2017-09-04T04:50:40.463 回答
0

我来到这里同样的错误。在我的例子中,没有任何东西在编译(构建?)并且 Eclipse 没有告诉我除了这些神秘的消息之外构建有任何问题。我最终解压缩了 jar 文件,发现里面没有类。这是因为我在构建路径中引用的项目没有构建。就我而言,该项目在一百万年内不会编译,但我可以访问研发部门的 jar 文件,他们可以并且确实以自己的方式编译它。所以我引用了那些 jar 文件。现在我的类编译并且错误消失了。我确定我会首先这样做,但是“有用”的 Eclipse 建议我参考未构建的项目,所以我同意了这个坏建议!

于 2018-09-13T22:17:16.880 回答