簡體   English   中英

在BASH腳本中運行JAVA程序時出現問題

[英]Having issue running JAVA program inside BASH script

我有一個bash腳本,如下所示。 我在這里所做的所有事情都是試圖運行一個傳入classpath和其他輸入的Java程序。

[guest@server1]# cat runJava
#!/bin/bash
JARS=/home/guest/lib/*
CONFIG=/home/guest/AnalyticServer.properties

echo JARS=$JARS
echo CONFIG=$CONFIG
echo "java -cp \"$JARS\" com.test.ASDataSourceClient DELETE -c \"$CONFIG\" -n test_ds"
java -cp "$JARS" com.test.ASDataSourceClient DELETE -c "$CONFIG" -n test_ds

直接在命令行/終端上運行時,java程序運行得很好。 我什至測試了直接從終端上(逐一)運行上述腳本中的所有命令,並驗證了Java程序運行正常。 但是,當我通過腳本啟動這些命令時,出現了問題。 它甚至似乎都沒有正確執行echo“ java -cp ..”命令。

任何人都可以建議我可能缺少的東西。

[guest@server1]# bash runJava
JARS=/home/guest/lib/*
CONFIG=/home/guest/AnalyticServer.properties
" -n test_dsaSourceClient DELETE -c "/home/guest/AnalyticServer.properties
Exception in thread "main" java.lang.NoClassDefFoundError: com/test/ASDataSourceClient
Caused by: java.lang.ClassNotFoundException: com.test.ASDataSourceClient
    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)
Could not find the main class: com.test.ASDataSourceClient.  Program will exit.

由於通配符的工作方式, JARS=/home/guest/lib/*不會執行您想要的操作。

相反,您可以使用

JARS=(/home/guest/lib/*)  # Put all the jars in an array 
IFS=:                     # Set the field separator to :
java -cp "${JARS[*]}" ... # Join all the array elements on the field separator

或模糊不清

JARS=""
for jar in /home/guest/lib/* # Loop through all the jar files
do
    JARS="$JARS:$jar"        # Append the jar file to the variable
done 
java -cp "$JARS" ...

這將使JARS變量包含以冒號分隔的jar文件列表。

指向包含JAR的目錄還不夠。 您需要明確命名它們,例如

JARS="/home/guest/lib/spring-beans-3.0.5.jar:anotherlibrary.jar"

我在您的腳本輸出中注意到了這條奇怪的行:

" -n test_dsaSourceClient DELETE -c "/home/guest/AnalyticServer.properties

這表示$ CONFIG以\\r字符結尾。 您是否正在Windows文本編輯器中編輯此腳本? 使用dos2unix刪除腳本中的回車

嘗試這個

#!/bin/bash

JARS=/home/guest/lib
CONFIG=/home/guest/AnalyticServer.properties

echo JARS=$JARS
echo CONFIG=$CONFIG

for file in `ls $JARS/*.jar`;
do
    classpath=$classpath:$file
done

cmd="java -classpath $classpath com.test.ASDataSourceClient DELETE -c $CONFIG -n test_ds"
echo $cmd
exec $cmd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM