gpt4 book ai didi

java - 从 bash 命令行和 OS X 中的脚本中获取运行 SWT 应用程序的不同类路径行为

转载 作者:行者123 更新时间:2023-12-02 03:21:19 24 4
gpt4 key购买 nike

我是 SWT 的新手,并且对 Java 和 Eclipse 不太熟悉。我一直在编写一个简单的应用程序来恢复心态(这实际上是我孙女的算术事实测验程序)。我正在为 cocoa/osx/x86_64 平台使用 SWT。最终目标是将应用程序打包到 OS X .app bundle 中。

这就是我跌倒并且无法站起来的地方:从 Eclipse IDE 内部执行时它可以正常工作,并且当使用 java 命令从交互式 bash shell 独立执行时也可以正常工作行,但从 shell 脚本内部运行时会引发 NoClassDefFoundError 异常。有问题的脚本尽可能简单:

#!/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 文件)和一堆绑定(bind)框架 jar(哇,这太痛苦了) ——但我离题了)。我试过:

a) 通过使用 Eclipse“导出到可运行的 jar”文件创建 list 。

b)通过“导出到 jar”创建 list (无论如何都会在 list 中添加“Rsrc-Main-Class”行,所以我不确定真正的区别是什么)。

c) 通过将随附的 jar 提取到库目录并修改 shell 脚本以添加 -classpath .:./libdir 来创建可运行的 jar

有问题的 list 是从生成的 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) list 显示为奇怪的 80 列自动换行,并在“jar xf MathDrill.jar META-INF”命令后加上空格。这是正常的吗?它肯定不是构建它的 ant 标签中的那样。

2) list 中的Class-Path和Rsrc-Class-Path有什么区别?

3) 当我在 Eclipse 中导出到 jar(而不是可运行的 jar)时,它会生成一个“jar-in-jar-loader.zip”文件。这是什么?我该如何使用它?

4) 有没有一种方法可以直接从 OS X bundle 执行 java,而无需某种脚本来启动它?我尝试按照我在 http://www.eclipse.org/swt/macosx/ 找到的说明进行操作,并且我还尝试使用 Platypus——在这两种情况下都有相同的类加载器异常。

5) 从 shell 脚本执行 java 时,环境是否发生了一些奇怪的情况?

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

最佳答案

您需要确保 shell 脚本将其工作目录更改为包含 .jar 文件的目录。如果 shell 脚本和 .jar 文件位于同一目录中,您可能只需要在 exec java 之前添加以下行:

cd "$(dirname "$0")"

否则,您可能需要在 shell 脚本中显式指定 .jar 文件的路径:

exec java \
-d64 \
-XstartOnFirstThread \
-jar "$(dirname "$0")/MathDrill.jar"

关于java - 从 bash 命令行和 OS X 中的脚本中获取运行 SWT 应用程序的不同类路径行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13905042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com