У меня проблема с устаревшей базой кода. Я хочу начать компилировать его в формате 1.6, но есть одна проблема, которая проявляется только тогда, когда я пытаюсь запустить скомпилированный код. Я получаю следующее исключение:
java.lang.ClassFormatError: Недействительные модификаторы классов в классе FooBar 0x209
Googling это не раскрывает много деталей. Согласно this, проблема может быть связана с несоответствием между модификаторами интерфейса и реализации. И, конечно же, это должно быть какое-то новое ограничение, которое не было в 1.5.
Проблематичный класс огромен и имеет множество внутренних классов и внутренних внутренних классов, поэтому проблему трудно отследить (это один из внутренних классов, я уверен). Излишне говорить, что класс не имеет никаких тестов, поэтому его изменение требует крайней осторожности и трудоемкости.
Итак, есть ли у кого-нибудь точная информация о 0x209 - что конкретно означает код?
EDIT:
Благодаря тому, что Арне натыкается на нас в правильном направлении, мы смогли выявить проблему и сделать обходной путь. Основная причина не совсем ясна, но теперь мы можем избежать этого.
Мы используем Doug Lea древний util.concurrent package в определенных областях, потому что некоторые компоненты работают в средах, которые предоставляют Java 1.1 (да, Это довольно хорошо смеяться, я не против).
Этот же код (с использованием параллельных utils) также используется в качестве небольшого компонента другого сопутствующего программного обеспечения. Поскольку код Doug использовал некоторые функции 1.2, нам также пришлось модифицировать некоторые части util.concurrent, чтобы сделать его совместимым с 1.1 пакетом коллекций Sun 1.1 (больше не найти ссылку на них). Как-то это вызвало это своеобразное поведение компиляции Eclipse, которое возникает, когда мы меняем формат класса на Java 1.6. Это минимальный код, который вызывает проблему:
EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap;
import com.sun.java.util.collections.Map;
public class FooBar
{
public static void main(String[] args) {
Map.Entry e = (Map.Entry)(new ConcurrentHashMap().entrySet().iterator().next());
}
}
После компиляции с Eclipse (с компиляцией, установленной в 1.6, 1.5 отлично работает) и попытайтесь загрузить класс из Sun 1.6 JRE, проблема возникает. Обходной путь: вместо того, чтобы перебирать записи, мы перебираем ключи и получаем значения внутри циклов с помощью клавиш.
Наша установка здесь настолько экзотична, что неудивительно, что никто другой не столкнулся с этим. Я, наконец, проверил наши скрипты сборки, и вот, ant - script имеет 1.6 исходных и целевых настроек. По-видимому, это специфичный для Eclipse.
EDIT2:
Я подошел ближе к отчету об ошибке Sun, который я здесь связал. Проблема там также связана с com.sun.java.util.collections.Map.Entry. И это произошло с Sun Javac. Интересно.