【问题标题】:Capturing a java NoClassDefFoundError thrown by program called via shell script捕获通过 shell 脚本调用的程序抛出的 java NoClassDefFoundError
【发布时间】:2012-05-15 06:22:17
【问题描述】:

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

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

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

【问题讨论】:

  • 我对 log4j 进行了一些研究,但据我了解,我认为这行不通。 NoClassDefFoundError 无法在程序内部被捕获以进行记录,因为它会立即强制退出。
  • 在你的 start 类的静态 main 方法中,你可以包含一个 try ... catch (Throwable) ... 这将能够处理 noclassdeferror
  • 啊,愚蠢的我,抓住 Throwable 是我所追求的......我从来没有使用过比异常更高的级别,所以从来没有真正考虑过。

标签: java shell unix


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    只是可以捕获错误,即

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2023-04-07
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多