Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获通过shell脚本调用的程序引发的java NoClassDefFoundError_Java_Shell_Unix - Fatal编程技术网

捕获通过shell脚本调用的程序引发的java NoClassDefFoundError

捕获通过shell脚本调用的程序引发的java NoClassDefFoundError,java,shell,unix,Java,Shell,Unix,我有一个java程序,它是Jasper Reports的编译器和执行器,通过报表服务器上的shell脚本调用 我刚刚修复了一个因缺少依赖性而导致的错误,但我花了一段时间才弄清楚到底出了什么问题。通常,由编译过程引起的问题会被捕获、记录到日志文件中并通过电子邮件发送给相关人员。由于这是一个NoClassDefFoundError,它基本上退出了程序,并且从用户的角度来看以一种无声的方式失败 有没有什么方法可以让我捕获像这样的错误,这样它们也可以通过电子邮件发送出去?我有权修改正在执行的shell脚

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

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


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

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

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

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

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


关于web中的流重定向有很多参考文献。如果我的例子不能让你满意,你可以看看。这取决于你的操作系统

只能捕捉错误,即

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,而不进行尝试。。挡块

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());
    }

我查看了一下log4j,但从我的理解来看,我认为这是行不通的。无法在要记录的程序中捕获NoClassDefFoundError,因为它会强制立即退出。在start类的静态main方法中,可以包含一个try。。。捕获(可丢弃)。。。这将能够处理NoClassederRorh愚蠢的我,捕获丢弃是我所追求的。。。我从来没有使用过比异常更高的级别,所以从来没有真正想过它。