另一个不寻常的java ClassNotFound

时间:2012-12-20 08:25:12

标签: java linux sh raspberry-pi

我有一个小程序和几个.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

我有所需的罐子,java已正确安装(多次检查),等等等等:

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

我已经使用了提供的答案和评论,这就是发生的事情:

  1. 还是一样的东西:(

  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
    
  3. 终端输出为:

    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并且它位于正确的路径中。

1 个答案:

答案 0 :(得分:4)

这可能是您未显示的脚本部分中的错误。试试这个:

  1. 确保脚本的第一行显示为#!/bin/bash

  2. 确保您位于您认为自己的文件夹中。添加

    if [ ! -e "$HSQLDB_JAR" ]; then echo "Jar not found!" ; exit 1 ; fi
    

    在致电java

  3. 之前
  4. 要查看shell实际执行的内容,请使用-x(将-x作为参数添加到第一行,或使用命令set -x激活它。)

  5. 如果需要生成相对于脚本的路径,请使用以下代码:

    BASE=$( cd $( dirname "$0" ) > /dev/null && pwd )
    HSQLDB_JAR="$BASE/../lib/hsqldb-2.2.8.jar"
    

    始终引用包含路径的变量,以确保空格正常工作。