我对 SWT 有点陌生,对 Java 和 Eclipse 很生疏。我一直在写一个简单的应用程序来恢复心态(它实际上是我孙女的算术事实测验程序)。我在 cocoa/osx/x86_64 平台上使用 SWT。最终目标是将应用程序打包到 OS X .app 包中。
这是我跌倒并且无法起床的地方:从 Eclipse IDE 内部执行时它可以正常工作,并且在使用 java 命令行从交互式 bash shell 独立执行时也可以正常工作,但是从运行时抛出 NoClassDefFoundError 异常在 shell 脚本中。有问题的脚本尽可能简单:
#!/bin/sh
exec java \
-d64 \
-XstartOnFirstThread \
-jar MathDrill.jar
堆栈跟踪是:
Exception in thread "main" java.lang.NoClassDefFoundError:
Caused by: java.lang.ClassNotFoundException:
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
我已经把所有东西都塞进了一个 jar 文件中,这个 jar 包含 swt.jar(它又包含平台的 *.jnilib 文件)和一堆绑定框架 jar(哇,这很痛苦——但是我离题了)。我试过了:
a) 通过使用 Eclipse “export to runnable jar”文件创建清单。
b)通过“export to jar”创建清单(无论如何都会在清单中添加“Rsrc-Main-Class”行,所以我不确定真正的区别是什么)。
c) 通过将随附的 jar 解压缩到 aa 库目录并修改 shell 脚本以添加 -classpath .:./libdir 来创建可运行的 jar
有问题的清单是,从生成的 jar 中提取 META-INF 后:
Manifest-Version: 1.0
Rsrc-Class-Path: ./ swing2swt.jar org.eclipse.core.databinding_1.4.1.v
20120521-2329.jar org.eclipse.core.databinding.beans_1.2.200.v2012052
3-1955.jar org.eclipse.core.databinding.observable_1.4.1.v20120521-23
29.jar org.eclipse.core.databinding.property_1.4.100.v20120523-1955.j
ar org.eclipse.jface.databinding_1.6.0.v20120521-2329.jar org.eclipse
.equinox.common_3.6.100.v20120522-1841.jar com.ibm.icu_4.4.2.v2011082
3.jar swt.jar
Ant-Version: Apache Ant 1.8.3
Class-Path: .
Created-By: 1.6.0_37-b06-434-10M3909 (Apple Inc.)
Rsrc-Main-Class: com.rutabaga.mathdrill.MathDrill
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
一些问题:
1) 清单在“jar xf MathDrill.jar META-INF”命令之后显示为怪异的 80 列自动换行加上空格。这是正常的吗?在构建它的 ant 标签中肯定不是这样的。
2)清单中的Class-Path和Rsrc-Class-Path有什么区别?
3)当我在 Eclipse 中导出到 jar(而不是可运行的 jar)时,它会生成一个“jar-in-jar-loader.zip”文件。这是什么?我应该如何使用它?
4) 有没有办法直接从 OS X 包执行 java 而无需某种脚本来启动它?我已经尝试按照我在http://www.eclipse.org/swt/macosx/找到的说明进行操作,并且我还尝试在这两种情况下都使用 Platypus——相同的类加载器异常。
5) 从 shell 脚本执行 java 时,环境是否发生了一些奇怪的事情?
任何帮助将不胜感激。我确定我做了一些愚蠢的事情,但我现在有点死在水里了。