在BASH脚本中运行JAVA程序时出现问题

在BASH脚本中运行JAVA程序时出现问题,java,bash,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 DELE

我有一个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.

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

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

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

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

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

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

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

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

#!/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
试试这个

#!/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
试试这个

#!/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
试试这个

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

由于globbing的工作方式,
JARS=/home/guest/lib/*
无法满足您的需要

相反,您可以使用

JARS=(/home/guest/lib/*)#将所有jar放入一个数组中
IFS=:#将字段分隔符设置为:
java-cp“${JARS[*]}”…#连接字段分隔符上的所有数组元素
或者说不那么隐晦

JARS=“”
对于/home/guest/lib/*#中的jar,循环遍历所有jar文件
做
JARS=“$JARS:$jar”#将jar文件附加到变量
完成
java-cp“$JARS”。。。

这将使
JARS
变量包含一个以冒号分隔的jar文件列表

由于globbing的工作方式,
JARS=/home/guest/lib/*
无法满足您的需要

相反,您可以使用

JARS=(/home/guest/lib/*)#将所有jar放入一个数组中
IFS=:#将字段分隔符设置为:
java-cp“${JARS[*]}”…#连接字段分隔符上的所有数组元素
或者说不那么隐晦

JARS=“”
对于/home/guest/lib/*#中的jar,循环遍历所有jar文件
做
JARS=“$JARS:$jar”#将jar文件附加到变量
完成
java-cp“$JARS”。。。

这将使
JARS
变量包含一个以冒号分隔的jar文件列表

由于globbing的工作方式,
JARS=/home/guest/lib/*
无法满足您的需要

相反,您可以使用

JARS=(/home/guest/lib/*)#将所有jar放入一个数组中
IFS=:#将字段分隔符设置为:
java-cp“${JARS[*]}”…#连接字段分隔符上的所有数组元素
或者说不那么隐晦

JARS=“”
对于/home/guest/lib/*#中的jar,循环遍历所有jar文件
做
JARS=“$JARS:$jar”#将jar文件附加到变量
完成
java-cp“$JARS”。。。

这将使
JARS
变量包含一个以冒号分隔的jar文件列表

由于globbing的工作方式,
JARS=/home/guest/lib/*
无法满足您的需要

相反,您可以使用

JARS=(/home/guest/lib/*)#将所有jar放入一个数组中
IFS=:#将字段分隔符设置为:
java-cp“${JARS[*]}”…#连接字段分隔符上的所有数组元素
或者说不那么隐晦

JARS=“”
对于/home/guest/lib/*#中的jar,循环遍历所有jar文件
做
JARS=“$JARS:$jar”#将jar文件附加到变量
完成
java-cp“$JARS”。。。

这将使
JARS
变量包含一个以冒号分隔的jar文件列表

我注意到脚本输出中有一行奇怪的代码:

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

表示$CONFIG以
\r
字符结尾。是否在Windows文本编辑器中编辑此脚本?使用
dos2unix
删除脚本中的回车符我注意到脚本输出中有一行奇怪的代码:

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

表示$CONFIG以
\r
字符结尾。是否在Windows文本编辑器中编辑此脚本?使用
dos2unix
删除脚本中的回车符我注意到脚本输出中有一行奇怪的代码:

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

表示$CONFIG以
\r
字符结尾。是否在Windows文本编辑器中编辑此脚本?使用
dos2unix
删除脚本中的回车符我注意到脚本输出中有一行奇怪的代码:

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

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

删除脚本中的回车符您的回音很好,应该会显示出来。错误消息来自java。你是如何运行脚本的?你的回音很好,应该会显示出来。错误消息来自java。你是如何运行脚本的?你的回音很好,应该会显示出来。错误消息来自java。你是如何运行脚本的?你的回音很好,应该会显示出来。错误消息来自java。您是如何运行脚本的?这个答案有两个问题:迭代
ls
的输出,以及依赖于参数的单词拆分扩展来等效于原始命令行。当它们涉及包含空格的文件名时,两者都会中断。这个答案有两个问题:迭代
ls
的输出,以及依赖于参数的单词拆分扩展来等效于原始命令行。当它们涉及包含空格的文件名时,两者都会中断。这个答案有两个问题:迭代
ls
的输出,以及依赖于参数的单词拆分扩展来等效于原始命令行。当它们涉及包含空格的文件名时,两者都会中断。这个答案有两个问题:迭代
ls
的输出,以及依赖于参数的单词拆分扩展来等效于或