В Eclipse, в чем разница между modulepath и classpath?

В Eclipse, в чем разница между modulepath и classpath, и какой из них я должен использовать, чтобы добавить jar в папку lib? И почему системная библиотека JRE появляется в модульном пути?

1 ответ

Решение

Система модулей оказывает в основном следующее влияние на код:

  • Доступ к пакету возможен только из одного модуля (вложенные пакеты рассматриваются как отдельные, поэтому, даже если пакет java.util находится в модуле java.base, посылка java.util.logging может быть в модуле java.logging)
  • Вы можете получить доступ только к открытым полям и методам кода в экспортированных пакетах других модулей. Это верно даже с отражением (т.е. java.lang.reflect.AccessibleObject.setAccessible(boolean) работает только для кода в том же модуле)

Весь код, который находится в classpath, живет вместе в "неназванном" модуле. Весь код на модульном пути живет в своих собственных "именованных" модулях.

Вы должны выделить два случая:

  • Если вы не добавите module-info.java в свой проект, ваш проект будет частью безымянного модуля и сможет видеть весь другой код в безымянном модуле, а также код в java.base и код в модулях в java.se корневой модуль. В основном это означает, что в коде пути к классу все по-прежнему работает, как в Java 8, поэтому вы должны просто поместить свои зависимости в путь к классам.

  • Если в вашем проекте есть module-info.java, ваш проект будет находиться в собственном именованном модуле и сможет видеть только код в java.base и другие именованные модули, которые являются ссылками с использованием "require"-clauses в module-info.java. Поскольку именованные модули находятся только через путь к модулю, вы должны поместить свои зависимости в путь к классам. Это даже работает для jar-файлов, созданных до java 9, которые получают имя модуля, полученное из имени файла.jar (в этом случае они называются "автоматическим" модулем).

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

Есть один особый случай: если у вас есть module-info.java в вашем проекте и есть тестовый код в вашем проекте, вы обычно не хотите упоминать тестовые зависимости, такие как junit, в module-info.java, Для этого есть два решения:

  • Создайте специальный тестовый модуль. Это всегда было условием для проектов, основанных на OSGI. Недостатком является то, что вы можете использовать только публичный API в своих тестах

  • Решение, используемое maven: поместите свои тестовые зависимости в путь к классам. При компиляции тестового кода maven добавляет параметры командной строки, которые позволяют коду в названном модуле читать безымянный модуль (что невозможно через module-info.java).

В Eclipse Oxygen решение maven оказалось невозможным, поскольку в нем нет понятия, какой код является тестовым кодом, но это было реализовано в следующем выпуске Eclipse Photon (4.8), который выйдет в июне. Вы уже можете работать со сборками ( полнофункциональными) вехами с http://download.eclipse.org/eclipse/downloads/. Если вы обнаружите какие-либо ошибки, сообщите о них по адресу https://bugs.eclipse.org/bugs/.

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