Почему классы, хранящиеся в банках, добавленные через пользовательский контейнер классов классов, недоступны для завершения кода?
Что необходимо для получения классов, предоставляемых через пользовательский контейнер классов классов, видимых при завершении кода?
Я успешно реализовал собственный контейнер классов, который добавляет библиотеки в проект. Он добавляет все банки в определенную папку в путь сборки, если в рабочей области нет проекта с тем же именем, в этом случае ссылается на проект.
Теперь, похоже, это работает, когда я ссылаюсь на класс из одной из этих банок, компиляция кода, но я не вижу класс в предложениях по завершению кода. Когда у меня есть правильный проект в моей рабочей области, я вижу такой класс в завершении кода.
Я сделал следующие шаги, чтобы достичь этого, в то время как я частично рассматривал учебное пособие от 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, если вы еще этого не сделали, и увидите, что он решает вашу проблему.