cobertura-instrument.sh fails to instrument jar file with java.lang.NoClassDefFoundError: net.sourceforge.cobertura.instrument.InstrumentMain

cobertura-instrument.sh fails to instrument jar file with java.lang.NoClassDefFoundError: net.sourceforge.cobertura.instrument.InstrumentMain

我正在尝试检测 jar 文件(来自 Spacewalk 项目),以便我可以测量我的测试的代码覆盖率,但它失败了:

# /opt/cobertura-2.1.1/cobertura-instrument.sh --datafile /tmp/out /usr/share/rhn/lib/rhn.jar
Exception in thread "main" java.lang.NoClassDefFoundError: net.sourceforge.cobertura.instrument.InstrumentMain
Caused by: java.lang.ClassNotFoundException: net.sourceforge.cobertura.instrument.InstrumentMain
    at java.net.URLClassLoader.findClass(URLClassLoader.java:432)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:676)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:358)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:642)
Could not find the main class: net.sourceforge.cobertura.instrument.InstrumentMain.  Program will exit.

我也尝试从那个 jar 中随机提供一个 class(在理想状态下我想检测所有这些),但结果相同:

# jar tf rhn.jar | tail
org/cobbler/CobblerConnection.class
[...]
# /opt/cobertura-2.1.1/cobertura-instrument.sh --datafile /tmp/out /usr/share/rhn/lib/rhn.jar org.cobbler.CobblerConnection

我很确定我只是遗漏了一些它试图告诉我的信息。

我正在使用 cobertura-2.1.1 从 SourceForge 下载并提取到 Red Hat Enterprise Linux 上的 /opt、运行 6.

好的,这很简单:

# dos2unix /opt/cobertura-2.1.1/cobertura-instrument.sh

它还缺少 bash shebang (#!/bin/bash),因此您可能需要将它添加到文件的开头(我不知道为什么它对我有用,即使没有它) .