2012-08-28 126 views
0

我對Apple腳本非常陌生,所以請耐心等待。我需要使用applescript運行.jar文件,jar不可執行,所以我調用class,如com.path.to.myClass。我的蘋果腳本看起來如下─從Apple腳本運行Java

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和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添加到classpath

當我從Terminal運行下面的命令它運行得很好。

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

我知道,它可以使用JAR Bundler更好的方式來完成,但我有過JAR及其開發利用別人的控制。有沒有辦法可以在YourApplicationName.app/Contents/MacOS/Resources/Java/目錄下的應用程序中包含所有JAR,並將其用於類路徑中。

+0

看一看這個答案[SO](http://stackoverflow.com/questions/12101240/java-lang-noclassdeffounderror-org-w3c-tidy-tidy-maven-project/12106292#12106292)。您還需要使用「;」如果你想添加更多的jar到類路徑 – Sal

+0

@Sal,那麼你可以在linux或者蘋果上使用「:」或者「:」。它基本上和我一樣。該命令在'terminal'(命令提示符)中工作,但在從'applescript'運行時失敗。 – Annjawn

回答

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文件添加到您可利用的classpath由java命令提供的快捷方式,其中以*結尾的類路徑條目包括給定目錄中的所有.jar文件。

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

*需要是反斜線由外殼以保護其免受擴張,反斜槓本身需要反斜槓轉義當它是一個AppleScript串內文字,因此\\*

+0

嗨謝謝,我能夠使用'*'通配符爲多個jar工作。但是,我有一個新問題 - 我的一些jar文件位於Windows網絡驅動器上。所以當我在類路徑中使用類似'smb:// user:pass @ server/shared/jars/*'的東西時,它似乎不起作用。有沒有辦法在jar文件中包含網絡路徑? (注意 - 這適用於Windows) – Annjawn

+0

不是我所知道的。您可以使用'mount volume「smb:// user:pass @ server/shared」'附加到共享,然後將其文件稱爲'/ Volumes/shared/jars/*',但這可能有點脆弱。 –

+0

@IanRoberts ...謝謝,是的,我必須安裝網絡驅動器。另外,對於你以前的觀點,'classpath'中的通配符用法只能在java 1.6上運行,用戶擁有java 1.5並且在他們的系統中不起作用,所以我必須將所有的jar包括到應用程序'resource'中並使用'set路徑(資源路徑「jarname.jar」)'找到路徑。我還必須在'do shell script'中將目錄(到那個路徑)更改爲'「JARDIR = $(dirname」&thePath &"); cd $ JARDIR「',然後使用'java -cp $ JARDIR/...: $ JARDIR/...'和改變的目錄工作。 – Annjawn