繁体   English   中英

Eclipse - JAR 创建失败“找不到类路径上的类文件或无法访问...”

[英]Eclipse - JAR creation failed "Class files on classpath not found or not accessible for..."

我在 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();
                }
            }
        }    
}

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

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

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

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

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/

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

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

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

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
{

}

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

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

我有同样的错误,在尝试了多个建议后,没有任何结果。 所以我创建了一个新的工作区并参考了这个项目。 之后,它成功构建并导出 JAR,没有错误。

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

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

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

就我而言,我遇到了同样的问题,我注意到我 mvn clean 并尝试导出 jar 并最终得到同样的错误。 在安装 mvn 之后它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM