Как Eclipse узнает, что com.sun - это ограниченный API?

Я использую ClassPath.getAllClasses от Guava найти во время выполнения классы, которые реализуют определенный интерфейс. При использовании с rt.jar он находит много классов из sun.* и подобные пакеты, и я хотел бы отфильтровать их.

Я хочу повторно использовать механизм, используемый Eclipse и, возможно, другими java-компиляторами для предупреждения об ограниченном API. Эта информация находится в JRE или жестко закодирована в Eclipse?

1 ответ

Решение

Эта информация хранится в так называемых профилях сред выполнения в Eclipse.

Потому что эти профили изначально OSGi (см. Bundle-RequiredExecutionEnvironment), профили хранятся в плагине org.eclipse.osgi в комплекте *.profile файлы, каждый из которых содержит белый список доступных пакетов (org.osgi.framework.system.packages), например, здесь для JavaSE-1.8,

Если вы создаете новый проект Java, вы можете выбрать либо

  • среда выполнения JRE, которая дает вам ошибки ограничения доступа для импорта, например: sun.* пакеты или
  • конкретная JRE без каких-либо ограничений доступа к пакетам JRE

После создания проекта выбранная JRE может быть изменена в Project> Properties: Java Build Path, на вкладке Libraries выберите JRE и нажмите Edit....

Кроме того, поскольку Java Platform Module System, представленная в Java 9, сама JRE ограничивает доступ к некоторым пакетам (и вместо файла rt.jar есть файл modules).

Другие вопросы по тегам