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->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 创建失败“找不到类路径上的类文件或无法访问...”的主要内容,如果未能解决你的问题,请参考以下文章