2012-02-06 66 views
0

這是一堂課。我以前從來沒有使用過shell腳本,但是說明書是編寫一個運行我的java程序的腳本(它已經全部設置爲接受命令行參數(至少一個參數,可選第二個參數))。我應該能夠像這樣運行它:Shell腳本:運行一個Java應用程序並通過腳本向它發送命令行參數?

./script.sh arg1 arg2 

但是,當我這樣做,我得到以下錯誤(我的Java主類名是A1):

Exception in thread "main" java.lang.NoClassDefFoundError: A1/class 
    Caused by: java.lang.ClassNotFoundException: A1.class 
    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:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    Could not find the main class: A1.class. Program will exit. 

這是什麼我的外殼腳本看起來像現在:

#!/bin/sh 

java -Xmx1024m A1.class [email protected] 

任何幫助表示讚賞。

回答

3

你需要告訴的java到哪裏尋找(使用-cp)類 - 無論是在一個目錄或一個.jar

要查找的腳本的目錄(相對於它從推出) ,你可以使用:$(dirname $0)

因此,舉例來說:

#!/bin/bash 

JVM=java 
JVM_OPTS="-Xmx1024m" 

$JVM $JVM_OPTS -cp $(dirname $0)/myapp.jar A1 "[email protected]" 

這是要明確一下你想要的外殼是一個好主意。還請注意圍繞[email protected]的引號,這是逃脫參數所需的引號。

+0

感謝您的幫助。結果我所要做的就是擺脫「.class」,但感謝提示。 – Tim 2012-02-06 02:15:12

2

運行java時使用classpath標誌來告訴虛擬機A1.class文件的位置。

doc

應該是這樣的:

java -classpath /myfolder A1 [email protected] 

而且,在運行命令時不要使用 「.class」 的後綴。

+0

非常感謝。我所做的只是擺脫「.class」,它的工作原理。 – Tim 2012-02-06 02:14:14