在BASH脚本中运行JAVA程序时遇到问题

时间:2014-02-03 18:04:25

标签: java bash

我有一个类似于下面的bash脚本。我在这里所做的就是尝试运行一个传递类路径和其他输入的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.

4 个答案:

答案 0 :(得分:3)

由于globbing的工作方式,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文件列表。

答案 1 :(得分:1)

指向包含JAR的目录是不够的。您需要明确命名它们,例如

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

答案 2 :(得分:0)

我在脚本输出中注意到这个奇怪的行:

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

这表示$ CONFIG以\r字符结尾。您是否在Windows文本编辑器中编辑此脚本?使用dos2unix

删除脚本中的回车符

答案 3 :(得分:-1)

试试这个

#!/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