我有一个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程序是否正常运行。但是,当我通过脚本启动这些命令时,我会出现问题。它甚至似乎都没有正确地执行" 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文件列表。
不足以指向包含罐子的目录。您需要明确命名它们,例如
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