2013-04-29 52 views
2

我写了一个具有主类方法的Demo类的shell脚本。使用unix通过crontab运行java类时发生ClassnotFoundException?

现在,当我运行我的shell使用./file.sh。它工作正常。

但现在我已经配置了一个cronjob使用crontab每5分钟执行一次该文件。

但是,这是给我一个classnotfoundException

Exception in thread "main" java.lang.NoClassDefFoundError: com/example/Demo 
Caused by: java.lang.ClassNotFoundException: com.example.Demo 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
     at java.security.AccessController.doPrivileged(Native Met 

这是我的shell文件。

#!/bin/sh 

echo 'Starts' 
lib1='HitURL.jar' 

CLASSPATH=$lib1 
java -cp HitURL.jar:. com.example.Demo http://www.google.com 
echo 'Ends' 

我该如何删除此错误?

谢谢。

+0

您的HitURL.jar文件位于何处? – 2013-04-29 15:12:58

+0

与shell脚本位于同一个文件夹中。/home/mine/script – Thinker 2013-04-29 15:13:18

+0

'在java.security.AccessController.doPrivileged(Native Met' < - 这剩下的是什么?我的猜测是脚本运行没有正确的权限。事实上AccessController正在抛出提示 – 2013-04-29 15:14:44

回答

3

我敢打赌,问题的关键在于,当您手动运行该脚本时,可以从HitURL.jar所在的目录运行它 - 而当cron运行该进程时,它可能会使用根目录作为当前目录。 因此我会改变它包括在lib1变量的完整路径HitURL.jar - 然后确保你还引用它在-cp参数是这样的:

#!/bin/sh 

echo 'Starts' 
lib1='/full/path/to/HitURL.jar' 

CLASSPATH=$lib1 
java -cp $lib1:. com.example.Demo http://www.google.com 
+0

刚刚看到你的回答上面有关路径/ home/mine/script - 所以lib1应该是这样的:lib1 ='/ home/mine/script/HitURL.jar' – Liv 2013-04-29 15:14:27

+0

另外,我建议让lib1也包含点:' lib1 =/home/mine/script/HitURL.jar:.' – Liv 2013-04-29 15:15:13

+0

你可以在'lib1'中添加所需的所有jar,并将它们分开: – Liv 2013-04-29 15:23:58

0

从事物的更UNIX侧,你能告诉cron来的文件夹中运行作业:

3 22 * * * archive (cd /home/archive/scriptDirectory && perl /home/archive/scriptDirectory/databackup.pl) 

通过这种方式,将工作完全像它在命令行中的测试一样。

+0

虽然这可以解决问题,但并不真正推荐,因为您依赖脚本始终在需要的目录中运行。试想一下,如果你不得不从'/ usr/local/bin'或类似的目录运行'perl',而不是你当前的目录(可能是你的脚本)。 – Liv 2013-04-29 15:27:42

+0

许多程序(每天都在为你工作)喜欢从自己的目录运行。他不想重写BIND 9或Sendmail,它只是一些小夜间脚本。 – 2013-04-29 15:31:04

+0

我欣赏这种情况(这就是为什么我没有投下你的答案),但这不是一个好习惯 - 任何系统操作员都会告诉你。 – Liv 2013-04-29 15:41:22

相关问题