Я предполагаю, что проект, переносимый из Java 1.8, все еще не имеет module-info.java
. Это означает, что вы компилируете код в «неназванном модуле».
Код в безымянном модуле «читает» все наблюдаемые именованные и безымянные модули, в частности, он читает модуль «java.xml» из системной библиотеки JRE. Этот модуль экспортирует пакет как java.xml.xpath
.
Кроме того, у вас есть xml-apis.java
на пути к классам, который предоставляет другой набор пакетов с такими же именами (java.xml.xpath
и друзья). Говорят, что они связаны с неназванным модулем, как ваш собственный код.
Эта ситуация нарушает требование "уникальной видимости" , как определено в JLS §7.4.3 (последний абзац). В частности, каждое квалифицированное имя типа Q.Id ( JSL §6.5.5.2 ) требует, чтобы его префикс Q был уникально видимым пакетом (для простоты я игнорирую случай вложенных типов). Ergo: программа недопустима и должна быть отклонена компиляторами.
Это оставляет нам один вопрос и два решения:
(1) Вопрос: почему javac принимает программу?
(2) Решение: Если вы добавите module-info.java
в свой проект, вы можете через контролировать , какой модуль читает ваш проект: requires java.xml;
или requires xml.apis;
(где "xml.apis") имя автоматического модуля "xml-apis-1.4.01.jar).
(3) Решение: Если не превратить ваш проект в модуль, вы все равно сможете избежать конфликта, исключив java.xml
из набора наблюдаемых модулей. В командной строке это будет сделано с помощью --limit-modules
. Эквивалентом в Eclipse является диалоговое окно «Сведения о модульности» , см. Также JDT 4.8 Новое и заслуживающее внимания (см. Вкладку Содержание ). Поскольку java.xml
неявно требуется через множество других наблюдаемых по умолчанию модулей, может быть хорошей идеей подтолкнуть все, кроме java.base
справа («явно включенные модули») влево («доступные модули») (и выборочно добавьте те модули, которые нужны вашему проекту).
PS: Eclipse по-прежнему не предоставляет идеального сообщения об ошибке, вместо «не может быть разрешено» оно должно фактически сказать: «Пакет javax.xml.xpath доступен из более чем одного модуля: javax.xml, .
PPS: Также странно: почему изменение порядка между JRE и jar на пути к классам (такое упорядочение не поддерживается ни javac, ни JEP 261) меняет поведение компилятора.
правок:
- Алекс Бакли подтвердил , что данная ситуация является незаконной, несмотря на то, что говорит Джавак. Ошибка в javac была поднята как JDK-8215739 . Эта ошибка была подтверждена за несколько месяцев до выпуска Java 12. По состоянию на 2019-06 гг. Было решено, что Java 13 будет поставляться без исправления.
- Eclipse error error был улучшен , чтобы упомянуть реальную проблему.
- В Eclipse 2019-06 пользовательский интерфейс, используемый для решения (3), был обновлен . Актуальную документацию можно найти в онлайн-справке .