我有一个小程序和几个.sh文件来执行它。我使用Raspberry-Pi虚拟盒模拟器运行它。(不要问为什么...只需要它.. :))因此,我的.SH文件看起来像:
export HSQLDB_JAR=../lib/hsqldb-2.2.8.jar
java -classpath $HSQLDB_JAR org.hsqldb.Server -database.0 ../my-hsqldb/my-hsqldb -dbname.0 my-hsqldb
我有所需的罐子,爪哇安装正确(几次检查),blah-blah,都相同:
rpi@RaspberryPi:/home/snb/my/apps/MyApp/bin$ sh skysql.sh
: not found2:
Exception in thread "main" java.lang.NoClassDefFoundError: org/hsqldb/Server
Caused by: java.lang.ClassNotFoundException: org.hsqldb.Server
最有趣的事情是,当我直接从bash中运行sh文件的脚本时 - 它可以工作!但是运行.sh文件给出此错误:(
任何帮助都非常感谢。
编辑
以下目录具有所有访问规则,因此不会发生安全问题。它们都可以访问。
编辑#2
我使用了提供的答案和评论,这就是发生的事情:
仍然相同的东西:(
我的.sh文件:
#!/bin/bash export HSQLDB_JAR="$(pwd)/hsqldb-2.2.8.jar" echo $HSQLDB_JAR java -classpath $HSQLDB_JAR org.hsqldb.Server -database.0 ../my-hsqldb/my-hsqldb -dbname.0 my-hsqldb
终端输出为:
rpi@RaspberryPi:/home/snb/my/apps/MyApp/bin$ sh skysql.sh
: not found2:
: not found4:
/home/snb/my/apps/MyApp/lib/hsqldb-2.2.8.jar
: not found6:
Exception in thread "main" java.lang.NoClassDefFoundError: org/hsqldb/Server
Caused by: java.lang.ClassNotFoundException: org.hsqldb.Server
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: org.hsqldb.Server. Program will exit.
: not found8:
因此,如您所见,实际上找到了.jar,并且在正确的路径中。
这可能是您不显示的脚本的一部分中的一个错误。尝试以下操作:
-
确保脚本的第一行读取
#!/bin/bash
-
确保您在您认为自己的文件夹中。添加
if [ ! -e "$HSQLDB_JAR" ]; then echo "Jar not found!" ; exit 1 ; fi
在致电
java
之前 要查看外壳实际执行的内容,请使用
-x
(将-x
作为参数添加到第一行,或使用命令set -x
激活它)。
如果您需要生成相对于脚本的路径,请使用此代码:
BASE=$( cd $( dirname "$0" ) > /dev/null && pwd )
HSQLDB_JAR="$BASE/../lib/hsqldb-2.2.8.jar"
总是引用包含路径的变量,以确保白空间正常工作。