Настройка проблемы состоит из трех java-библиотек (я убрал все имена пакетов для удобочитаемости, везде используются полные имена):
external-lib: предоставляет абстрактный класс
public abstract class AbstractExternal {}
my-lib-A: предоставляет класс
public class ClassA extends AbstractExternal { public static final String FOO = "foo"; }
external-lib
находится в пути к классам my-lib-A.my-lib-B статически импортирует FOO из ClassA:
import static ClassA.FOO; public class ClassB { private String foo = FOO; }
my-lib-A
находится в пути к классам my-lib-B, аexternal-lib
— нет.
Проблема: Строка import static
выдает следующую ошибку:
The type AbstractExternal cannot be resolved. It is indirectly referenced from required .class files
.
Однако (1), при изменении ClassB на
import ClassA;
public class ClassB {
private String foo = ClassA.FOO;
}
компилятор доволен.
Однако (2), при добавлении второй абстракции две my-lib-A вроде
public class AbstractClassA extends AbstractExternal {}
а также
public class ClassA extends AbstractClassA {
public static final String FOO = "foo";
}
статический импорт ClassA.FOO в приведенном выше примере работает.
Вопрос 1: Почему import static ClassA.FOO
не работает, а import ClassA
с ClassA.FOO
работает?
Вопрос 2: Почему import static ClassA.FOO
работает, когда он расширяет другой класс из my-lib-A, который затем расширяет AbstractExternal?
Изменить: важная информация: речь идет о компиляторе компиляторе Eclipse. для Java (ECJ).
Редактировать 2: javac синхронизирован с ECJ и может скомпилировать обычный импорт и доступ к классу в ClassB, в то время как статический импорт терпит неудачу.