当前位置: 首页 > 知识库问答 >
问题:

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

彭展
2023-03-14

我对SWT有点新手,对Java和Eclipse基本上已经生疏了。我一直在写一个简单的应用程序来恢复心态(这实际上是我孙女的算术事实测验程序)。我正在使用SWT作为可可/osx/x86_64平台。最终目标是将应用程序打包成OS X。应用程序捆绑包。

这就是我摔倒和爬不起来的地方:从Eclipse IDE内部执行时,它工作正常,使用java命令行从交互式bash外壳独立执行时,它也工作正常,但是从外壳脚本内部运行时,会抛出一个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文件)和一堆绑定框架jar(哇,这很痛苦——但我离题了)。我试过:

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

b) 通过“export to jar”创建清单(这会在清单中添加一行“Rsrc Main Class”,所以我不确定真正的区别是什么)。

c) 通过将封闭的jar提取到库目录并修改shell脚本以添加-classpath.:,创建可运行的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 mathdill.jar META-INF”命令后显示为古怪的80列换行符加空格。这正常吗?在构建它的ant标记中肯定不是这样的。

2) 清单中的类路径和Rsrc类路径有什么区别?

3) 当我在Eclipse中导出到jar(而不是runnable jar)时,它会生成一个“jar in jar loader.zip”文件。这是什么?我该怎么用呢?

4) 有没有一种直接从OS启动java脚本的方式?我试着按照我在http://www.eclipse.org/swt/macosx/,我也尝试过使用Platypus——在这两种情况下都有相同的类装入器异常。

5)从外壳脚本执行java时,环境会发生一些奇怪的事情吗?

任何帮助都将不胜感激。我肯定我做了些蠢事,但我现在有点死在水里了。

共有1个答案

公西财
2023-03-14

您需要确保shell脚本将其工作目录更改为包含的目录。jar文件。如果shell脚本和。jar文件位于同一个目录中,您可能只需要在exec java前面的几行代码:

cd "$(dirname "$0")"

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

exec java \
   -d64 \ 
   -XstartOnFirstThread \
   -jar "$(dirname "$0")/MathDrill.jar"
 类似资料:
  • 当我试图登录本地postgres数据库并提交查询时,我的BASH脚本中的psql命令遇到了问题。我以以下方式使用该命令: 但是,我收到以下错误消息。 PSQL: FATAL:用户"postgres"的身份验证失败 在我将以下更改附加到 /var/lib/pgsql/data/pg_hba.conf后,从命令行运行非常好: 本地所有信任 托管所有127.0.0.1/32信任 另外,能否验证一下这一点

  • 问题内容: 嗨,我正在开发一个需要我运行一些bash代码的应用程序,有没有一种方法可以将脚本硬编码到我的应用程序中然后运行它?例如(这是一个非常简化的示例) 我有以下方法来运行一行bash命令,但需要在多行中运行类似的内容。同样,上面的代码是一个非常简化的示例,我实际上在执行的操作必须通过脚本运行,而不能通过Java完成。我也想对它进行硬编码,因为我知道可以将脚本存储在手机上并使用以下命令运行它,

  • 问题内容: 当我尝试从PyCharm IDE运行程序时,一切正常,但是如果我输入Fedora: 在shell提示中,我从1个模块收到导入错误。 当从IDE启动时,PyCharm可以执行哪些操作以使解释器找到我的依赖项?如何获得脚本以找到其依赖项,以便可以使用singe命令启动它? 问题答案: 有一些可能的原因可能导致这种情况: 相同的python解释器?检查与 它是同一工作目录吗?检查与 中的差异

  • 我如何通过命令行运行它?

  • 问题内容: 我有一个使用WINE在Linux上运行的Windows程序。 如何从Windows程序调用Linux Shell命令? 问题答案: 编辑:user1182474的评论是正确的; Wine不会隔离它运行的程序。(它试图隐藏它,但不是很彻底。)我完全无法使用Google。Psen在下面的评论更正确,并引用了FAQ。(请注意,要使其正常工作,您可能需要通过Wine驱动器映射获得程序的目录。或

  • 问题内容: 我已经在.jar文件清单中指定了Java程序的主类和类路径,但有时我想运行与该属性指定的类不同的类。我可以在仍然从清单中拉出类路径的同时让Java启动此类,这样我就不必在命令行上用来指定整个东西了吗? 问题答案: 只需使用-cp将jar文件放在命令行中即可;然后,即使您未使用-jar,Java也会观察清单中的classpath属性: