有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我对SWT有点生疏,对Java和Eclipse基本上有些生疏。我一直在编写一个简单的应用程序来恢复这种心态(它实际上是我孙女的一个算术事实测验程序)。我将SWT用于cocoa/osx/x86_64平台。最终的目标是将应用程序打包成一个OS X。应用程序包

这就是我摔倒了,站不起来的地方:当从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文件)和一堆绑定框架jar(哇,这很痛苦——但我离题了)。我试过:

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

b)通过“导出到jar”创建清单(这会在清单中添加一行“Rsrc主类”,所以我不确定真正的区别是什么)

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 X捆绑包执行java,而不需要某种脚本来启动它?我试着按照我在http://www.eclipse.org/swt/macosx/上找到的说明进行操作,还试着使用Platypus——在这两种情况下都是同一个类装入器异常

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    cd "$(dirname "$0")"
    

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

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