Использовали ли вы tattletale на работающем или нерабочем компьютере?
Возможно, в сбойной среде содержится какой-то jar-файл в jre / lib / ext (или аналогичном каталоге расширений), и это используется в настройкахв «более низкую» версию?
РЕДАКТИРОВАТЬ: Просто чтобы немного подробнее узнать о ситуациях, в которых может быть выброшено NoClassDefFoundError
, стоит прочитать спецификацию JVM, глава 5 * 1007.*.В нем говорится о трех ситуациях:
- Ресурс, соответствующий классу, вообще не может быть найден
- Ресурс найден, но не соответствует нужному классу (хотяв этом случае я ожидаю сообщение с «неправильным именем»)
- Вы используете версию Java более раннюю, чем 1.2, а файл класса имеет неподдерживаемый номер основной / вспомогательной версии.(Эта ситуация теперь выдает
UnsupportedClassVersionError
.)
Также читайте раздел 2.17.5 : в нем говорится, что если класс находится в «ошибочном состоянии» (например, ранее инициализация не удалась)или произошел сбой проверки байт-кода), тогда будет выдано NoClassDefFoundError
.
Теперь, если статический инициализатор класса завершится неудачно, тогда первый вызывающий абонент увидит ExceptionInInitializerError
- но второй абонент видит NoClassDefFoundError
.Вот короткая, но полная программа, демонстрирующая это:
class Foo {
static {
if (true) {
throw new RuntimeException();
}
}
static void foo() {
}
}
public class Test {
public static void main(String[] args) {
try {
Foo.foo();
} catch (Throwable t) {
System.out.println("First exception: " + t);
}
try {
Foo.foo();
} catch (Throwable t) {
System.out.println("Second exception: " + t);
}
}
}
Теперь, если что-то в вашей системе не подавляет ExceptionInInitializerError
, я бы ожидал , чтобы увидеть это в журнале до NoClassDefFoundError
если бы это была проблема.Я все еще думаю, что более вероятно , что ваша неисправная система загружает один класс в загрузчик классов расширений, который затем не может найти класс ShiteSpaceProcessor
.