В 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/.