3

私はSWTの初心者で、JavaとEclipse全般にさびています。私は考え方を回復するための簡単なアプリを書いています(それは実際には私の孫娘のための算術事実クイズプログラムです)。cocoa / osx/x86_64プラットフォームにSWTを使用しています。最終的な目標は、アプリをOSX.appバンドルにパッケージ化することです。

ここで私は落ちて立ち上がれません: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)

私はすべてを1つのjarファイルにまとめました。jarにはswt.jar(プラットフォームの* .jnilibファイルが含まれています)と一連のバインディングフレームワークjar(うわー、それは苦痛でしたが、私は逸脱します)。私はもう試した:

a)Eclipseの「実行可能なjarへのエクスポート」ファイルを使用してマニフェストを作成します。

b)「exportto jar」を使用してマニフェストを作成します(これにより、マニフェストに「Rsrc-Main-Class」行が追加されるため、実際の違いはわかりません)。

c)囲まれたjarをライブラリディレクトリに抽出し、シェルスクリプトを変更して-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列のワードラップとスペースで表示されます。これは正常ですか?それは確かにそれを構築したアリのタグではそうではありません。

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)シェルスクリプトからJavaを実行すると、環境に何か奇妙なことが起こりますか?

どんな助けでも大歓迎です。私は何か愚かなことをしたと確信していますが、私は今のところ水中でちょっと死んでいます。

4

1 に答える 1

0

シェルスクリプトが作業ディレクトリをファイルを含むディレクトリに変更することを確認する必要があり.jarます。シェル スクリプトと.jarファイルが同じディレクトリにある場合は、次の行の直前に次の行が必要になる場合がありますexec java

cd "$(dirname "$0")"

それ以外の場合は、次を.jar使用して、シェル スクリプトでファイルへのパスを明示的に指定する必要がある場合があります。

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