4

免责声明

这是 .NET GUI 试图以自己的方式解决 JAVA 问题的经典案例。

问题描述:

我正在尝试使用 JFace 和 SWT 构建一个非常简单的 GUI - 代码很简单(有很多教程),它不是那么简单的是我似乎无法让 JFace 和 SWT 在插件项目之外工作。

我希望能够在我的项目中轻松使用 JFace 和 SWT,因为我将“C:/eclipse 3.5/plugins”放在我的 CLASSPATH 中(从我的计算机 --> 属性 --> 高级 --> 环境变量)以及我可以在我的 PATH 中找到的所有 swt-*.dll(当然包括本地用户和全局 PATH),正如本文在“安装 SWT 和 JFace”框中所指出的那样。

问题是我不能从 eclipse.org 导入任何东西,除非我直接从 buildpath 引用 jar --> 库 --> 添加外部 jar(为了构建它,我必须添加以下 jar:org.eclipse.swt .win32.win32.x86_3.5.1.v3555a.jarorg.eclipse.jface_3.5.1.M20090826-0800.jar)。一旦我这样做了,它就可以很好地构建,但是当我将它作为“Java应用程序”运行时,我会收到以下错误(我应该以其他方式运行吗?):

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IProgressMonitor
    at demo.ui.test.EntryPoint.main(EntryPoint.java:18)
Caused by: java.lang.ClassNotFoundException: org.eclipse.core.runtime.IProgressMonitor
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    ... 1 more

我尝试对此进行调试,基本上它在尝试实例化ApplicationWindow类(org.eclipse.jface.window.ApplicationWindow)时就被抛出。试图重现该错误,我注释掉了我的所有代码,并在我的 main 中将其替换为以下代码,它在第一行抛出了与上面相同的错误:

ApplicationWindow w = new ApplicationWindow(null); //<-- error on this line
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();

问题:

问题 1:我怎样才能修复上面的错误(我想了解发生了什么)并让该死的东西运行?

问题2:为什么我的项目看不到罐子以及如何制作它们?

由于我对 Java 和 eclipse 不熟悉,我可能遗漏了一些非常琐碎的东西。任何帮助都非常感谢!

编辑:似乎其他人也有同样的问题-> http://www.eclipsezone.com/eclipse/forums/t60528.html-虽然不太清楚他们是如何解决的,但感谢您的帮助

4

2 回答 2

11

IProgressMonitor接口在你使用的那两个 jar 中不可用。您还需要将org.eclipse.equinox.common插件放在您的类路径中。IProgressMonitor可以在不运行整个 Eclipse 环境的情况下使用。

(这是您参考的文章中的解决方案。我最初认为 IProgressMonitor 在 org.eclipse.core.runtime 插件中,但它已移至 org.eclipse.equinox.common,如错误 #122935中所述)

于 2009-12-23T13:37:02.917 回答
6

与 Peter 的上述观点相呼应,我总是必须添加一堆 JAR 才能让事情运行起来(尤其是对于 JFace)。通常,我需要

./org.eclipse.core.commands_3.3.0.I20070605-0010.jar
./org.eclipse.core.runtime_3.3.100.v20070530.jar
./org.eclipse.equinox.common_3.3.0.v20070426.jar
./org.eclipse.jface_3.3.1.M20070910-0800b.jar
./org.eclipse.osgi_3.3.2.R33x_v20080105.jar
./org.eclipse.ui.forms_3.3.0.v20070511.jar

您可以使用 jarfinder 之类的工具来帮助发现哪些文件存在于哪些 JAR 中。在 Windows 中,我似乎记得使用查找功能IProgressMonitor.class在文件系统上的 eclipse 文件夹下的 zip/jar 文件中查找,因为有时实际的 JAR 可能很难追踪。

我通常通过查看失败、跟踪/添加 JAR、冲洗并重复来工作。

Doing RCP/plugins seems like Eclipse takes care of a lot of the issues for you, doing your own stand alone app comes with this extra baggage but its really nice to have a proper stand-alone native looking GUI if you stick with it. So I typically setup vanilla (non-plugin) eclipse projects and it forces you to confront these issues (add JARs to the classpath manually). It also comes in handy as and when you want to distribute your project.

于 2010-01-19T20:35:56.073 回答