0

私は Apple スクリプト作成に非常に慣れていないので、ご容赦ください。.jarを使用してファイルを実行する必要があります。 は実行可能applescriptではないため、 likejarを呼び出します。私のAppleスクリプトは以下のようになります-classcom.path.to.myClass

display alert "You are about to start the image rename process." buttons {"OK", "Cancel"}
set theAnswer to button returned of the result
if theAnswer is "OK" then
    do shell script "java -classpath ./ImageRename_JAVA-1.0.0.jar:. com.mff.image.rename.Main"
else
    say "Exit"
end if

applescript と the の両方ImageRename_JAVA-1.0.0.jarが同じディレクトリにありますが、スクリプトを実行するとエラーが発生します。

error "Exception in thread \"main\" java.lang.NoClassDefFoundError: com/mff/image/rename/Main
Caused by: java.lang.ClassNotFoundException: com.mff.image.rename.Main
    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)" number 1

設定がclasspath間違っていますか?もしそうなら、正しい方法は何ですか?jarまた、にsを追加するにはどうすればよいclasspathですか?

以下のコマンドを実行すると、問題なく実行されTerminalます。

$ java -classpath ./ImageRename_JAVA-1.0.0.jar:. com.mff.image.rename.Main

を使用してより良い方法で実行できることは知っていますが、他の誰かによって開発されたものをJAR Bundler制御することはできません。ディレクトリの下のアプリケーション内JARにすべての s を含めて、それらをクラスパスで使用する方法はありますか?JARYourApplicationName.app/Contents/MacOS/Resources/Java/

4

1 に答える 1

2

での作業ディレクトリが何であるかを保証できるとは思いませんが、次のdo shell scriptような方法で解決できます。

set scriptPath to the POSIX path of (path to me)
do shell script "SCRIPTDIR=`dirname " & scriptPath & "` ; " ¬
    & "java -classpath $SCRIPTDIR/ImageRename_JAVA-1.0.0.jar:$SCRIPTDIR com.mff.image.rename.Main"

クラスパスにJARを追加するには、javaコマンドによって提供されるショートカットを利用できます。これにより、で終わるクラスパスエントリには、指定されたディレクトリ内の*すべての.jarファイルが含まれます。

do shell script "java -classpath " ¬
  & "/Applications/Something.app/Contents/Resources/Java/\\* com.example.MyClass"

シェル*による拡張から保護するには、バックスラッシュをエスケープする必要があります。また、バックスラッシュ自体は、AppleScript文字列リテラル内にある場合はバックスラッシュエスケープする必要があります。したがって、\\*

于 2012-08-28T16:02:38.263 に答える