【问题标题】:Having issue running JAVA program inside BASH script在 BASH 脚本中运行 JAVA 程序时遇到问题
【发布时间】:2014-02-03 18:04:25
【问题描述】:

我有一个如下所示的 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.

【问题讨论】:

  • 您的回声很好,应该会显示出来。错误消息来自java。你是如何运行脚本的?

标签: java bash


【解决方案1】:

由于通配的工作方式,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+=":$jar" 进行字符串连接——不确定需要什么版本的 bash。另外,用"${JARS#:}"修剪前导冒号
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我会尝试这种方法,但不明白为什么 * 不会扩展以查找该目录中的所有 jar 文件。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    试试这个

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

    【讨论】:

    • 这个答案有两个问题:迭代ls的输出,以及依赖参数的分词扩展来等效于原始命令行。当它们涉及包含空格的文件名时,两者都会中断。
    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2022-10-16
    相关资源
    最近更新 更多