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

Posted

技术标签:

【中文标题】Eclipse - JAR 创建失败“找不到类路径上的类文件或无法访问...”【英文标题】:Eclipse - JAR creation failed "Class files on classpath not found or not accessible for..." 【发布时间】:2013-08-20 11:36:04 【问题描述】:

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

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

【问题讨论】:

你试过清理和重建吗? 不这么认为...我该怎么做? 查看Project菜单 @adarshr 找到了。现在可以编译了,谢谢,您要添加答案以便我接受吗? 这解决了我的问题:***.com/questions/12126985/… 【参考方案1】:

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

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

【讨论】:

感谢您的回答。我会接受你的,好像你给了我最快的解决方案。 :) 知道为什么这很困难吗? 仅仅是因为 Eclipse 在您重新安装 Windows 之前最后一次编译了您的代码。现在它找不到部分或全部类文件。因此,通过进行干净 + 重建,您将告诉 Eclipse 丢弃任何现有的类文件并从头开始重新编译。通常我们会在开始任何新工作之前将此作为第一步,以排除不一致的情况。 搞乱“干净”毁掉了我的整个项目。从历史中恢复只恢复了几个班级。以为我可以分享一下【参考方案2】:

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

【讨论】:

就我而言,整个班级都被注释掉了。【参考方案3】:

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-&gt;Clean Up

【讨论】:

+1 感谢您的回答。我不需要做第一部分,我只是做了一个干净的:)【参考方案4】:

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

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



【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于Eclipse - JAR 创建失败“找不到类路径上的类文件或无法访问...”的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 找不到类路径:db/migrations

无法在Eclipse上创建可执行JAR。找不到主要的

eclipse打包可执行jar文件出错

eclipse集成fat jar失败总结

Eclipse导出jar包Unity打包错误

关于java代码打包成JAR的运行结果和eclipse中运行结果不一样的问题