Javac не удается скомпилировать аннотации по статическим вложенным классам, которые имеют общедоступный список перечислений
Я столкнулся с следующим сбоем компиляции javac, где javac не распознал аннотации в статическом вложенном классе, у которого было общедоступное перечисление. Как только я переместил перечисление из статического вложенного класса, ошибки компиляции были решены. Кто-нибудь знает, почему Javac не удалось? Является ли это ошибкой компилятора java? Или есть java-нюанс, о котором я не знаю?
Ниже представлен отдельный тестовый пример.
Не удалось скомпилировать:
package test;
import test.AnnotationBug.NestedClassWithEnum.ParticipantType;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.googlecode.objectify.annotation.Embed;
public class AnnotationBug {
ParticipantType type;
@Embed
@Data
@NoArgsConstructor
public static final class NestedClassNoEnum {
}
@Embed
@Data
@NoArgsConstructor
public static final class NestedClassWithEnum {
ParticipantType type;
public enum ParticipantType {
ORGANIZER,
REGISTERED,
WAIT_LISTED
}
}
}
Вывод компиляции:
$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar test/AnnotationBug.java
test/AnnotationBug.java:20: error: cannot find symbol
@Embed
^
symbol: class Embed
location: class AnnotationBug
test/AnnotationBug.java:21: error: cannot find symbol
@Data
^
symbol: class Data
location: class AnnotationBug
test/AnnotationBug.java:22: error: cannot find symbol
@NoArgsConstructor
^
symbol: class NoArgsConstructor
location: class AnnotationBug
компилирует:
package test;
// import test.AnnotationBug.NestedClassWithEnum.ParticipantType;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.googlecode.objectify.annotation.Embed;
public class AnnotationBug {
ParticipantType type;
@Embed
@Data
@NoArgsConstructor
public static final class NestedClassNoEnum {
}
@Embed
@Data
@NoArgsConstructor
public static final class NestedClassWithEnum {
ParticipantType type;
}
public enum ParticipantType {
ORGANIZER,
REGISTERED,
WAIT_LISTED
}
}
Скомпилирует без ошибок:
$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar test/AnnotationBug.java
Что нужно отметить:
1) Обратите внимание на номер строки сбоя компиляции. Нет никакой проблемы при анализе аннотации NestedClassNoEnum.
2) Версия Java:
$ java -version
java version "1.7.0_21"
OpenJDK Runtime Environment (IcedTea 2.3.9) (7u21-2.3.9-0ubuntu0.12.10.1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
Ответы
Ответ 1
Если вы удалите импорт статического класса, код компилируется отлично, см. ниже код [Примечание: я не использовал аннотацию @Embed, поскольку у меня не было jar для нее, но это не имеет никакого значения]:
//import NestedClassWithEnum.ParticipantType;
import lombok.Data;
import lombok.NoArgsConstructor;
public class AnnotationBug {
NestedClassWithEnum.ParticipantType type;
@Data
@NoArgsConstructor
public static final class NestedClassNoEnum {
}
@Data
@NoArgsConstructor
public static final class NestedClassWithEnum {
ParticipantType type;
public enum ParticipantType {
ORGANIZER,
REGISTERED,
WAIT_LISTED
}
}
}
Причина, по-видимому, связана с загрузкой классов и статическими классами. Ожидается, что загружаются enums, когда статические классы загружаются лениво. Поэтому java может пытаться остановиться во время компиляции, но это предположение.
EDIT:
Согласно обсуждению с Паулом, предположение не правильное.
Ответ 2
Это ошибка Ломбока. См. https://github.com/rzwitserloot/lombok/issues/1249 для официального отчета об ошибке.