捕获由shell脚本调用的程序抛出的java NoClassDefFoundError

时间:2012-05-15 06:22:17

标签: java shell unix

我有一个java程序,它是Jasper Reports的编译器和执行程序,在我们的报告服务器上通过shell脚本调用。

我刚刚修复了由于缺少依赖性而导致的错误,但我花了一些时间来弄清楚出了什么问题。通常,捕获由编译过程引起的问题,将其记录到日志文件中并通过电子邮件发送给相关人员。由于这是一个NoClassDefFoundError,它基本上退出了程序,并从用户角度以静默方式失败。

我有什么方法可以捕获像这样的错误,以便它们也可以通过电子邮件发送出去?我有权修改执行的shell脚本。

2 个答案:

答案 0 :(得分:0)

通常,应用程序代码不会捕获错误,并且会将错误抛出到JVM级别,并将它们打印到STDERR。因此,您跟踪此错误的方法是将STDERR重定向到文件:

java -cp YourMain 1>stdout.log 2>stderr.log

您也可以将STDOUT和STDERR放在一起:

java -cp YourMain 1>&2 2>wholelog.log

关于web中的流重定向有很多参考。如果我的例子不满足你,你可以看看那里。这取决于您的操作系统。

答案 1 :(得分:0)

只能抓住错误,即

try {
        numericDefinition = new net.sf.cb2xml.def.BasicNumericDefinition(
                    binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize
            );
} catch (NoClassDefFoundError e) {
        System.out.println("Class Not Found: " + e.getMessage());
}

你需要非常小心你的编码,很容易在类初始化时抛出 NoClassDefFoundError 并且不会进入try .. catch块。

NoClassDefFoundError 将在第一次引用类时抛出,这可能是当类使用使用类的类的时候...使用引用的类一个不存在的类。

由于导入,在类初始化时,以下可能会因 NoClassDefFoundError 而失败。

import net.sf.cb2xml.def.BasicNumericDefinition; // could cause the NoClassDefFoundError

     ...........
 try {
            numericDefinition = new BasicNumericDefinition(
                        binName, binarySizes, SynchronizeAt, usePositive, floatSynchronize, doubleSynchronize
                );
    } catch (NoClassDefFoundError e) {
            System.out.println("Class Not Found: " + e.getMessage());
    }