Почему классы, хранящиеся в банках, добавленные через пользовательский контейнер классов классов, недоступны для завершения кода?

Что необходимо для получения классов, предоставляемых через пользовательский контейнер классов классов, видимых при завершении кода?

Я успешно реализовал собственный контейнер классов, который добавляет библиотеки в проект. Он добавляет все банки в определенную папку в путь сборки, если в рабочей области нет проекта с тем же именем, в этом случае ссылается на проект.

Теперь, похоже, это работает, когда я ссылаюсь на класс из одной из этих банок, компиляция кода, но я не вижу класс в предложениях по завершению кода. Когда у меня есть правильный проект в моей рабочей области, я вижу такой класс в завершении кода.

Я сделал следующие шаги, чтобы достичь этого, в то время как я частично рассматривал учебное пособие от IBM:

  • Реализация ClasspathContainerInitializer
  • Внедрение ClasspathContainerPreferencePage для дополнительной конфигурации
  • Внедрение IClasspathContainer

Когда я добавил контейнер в проект, я вижу банки в проводнике пакетов, как и ожидал. (Jar там, только если соответствующий проект недоступен, Logging показывает ожидаемые результаты)

Я могу использовать классы из jars, интегрированных через контейнер classpath без ошибок компилятора, они просто недоступны для завершения кода и в Quick Fixes, чтобы добавить правильный импорт. Поэтому я думаю, что, возможно, просто пропущу вклад в какую-то точку расширения.

Ответ 1

Ответ в основном таков: вам не нужно ничего делать, кроме как реализовать три части. Но вы должны сделать это правильно.

КлассpathContainerPreferencePage, чтобы подготовить контейнер для добавления его в проект.

КлассpathContainer как объект, добавляемый в проект. Для этого очень важно правильно реализовать все необходимые методы. Для меня проблема заключалась в том, что я вернул неправильное постоянное значение в методе getKind(). Вместо того, чтобы возвращать IClasspathEntry.CPE_CONTAINER, мне просто нужно было использовать IClasspathContainer.K_APPLICATION и завершение кода, выполненное из коробки:

public int getKind() {
    return IClasspathContainer.K_APPLICATION;
}

И, наконец, ClasspathContainerInitializer для подготовки и обновления контейнера.

Ответ 2

Я использую Eclipse Luna, а Eclipse выполняет автозаполнение кода даже из пользовательских внешних JAR. Вы должны рассмотреть возможность перехода на Luna, если вы еще этого не сделали, и увидите, что он решает вашу проблему.