3

我对 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 时,环境是否发生了一些奇怪的事情?

任何帮助将不胜感激。我确定我做了一些愚蠢的事情,但我现在有点死在水里了。

4

1 回答 1

0

您需要确保 shell 脚本将其工作目录更改为包含该.jar文件的目录。如果 shell 脚本和.jar文件在同一个目录中,你可能只需要在exec java:

cd "$(dirname "$0")"

否则,您可能需要使用以下.jar命令在 shell 脚本中明确指定文件的路径:

exec java \
   -d64 \ 
   -XstartOnFirstThread \
   -jar "$(dirname "$0")/MathDrill.jar"
于 2012-12-16T22:54:27.937 回答