Ответ 1
Я предполагаю, что проект, переносимый с 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, & lt; unnamed>.
PPS: Также странно: почему изменение порядка между JRE и jar на пути к классам (такое упорядочение не поддерживается ни Javac, ни JEP 261) меняет поведение компилятора.
Редактирует:
- Алекс Бакли подтвердил, что данная ситуация незаконна, несмотря на то, что говорит Джавак. Ошибка в javac была поднята как JDK-8215739. Эта ошибка была подтверждена за несколько месяцев до выпуска Java 12. По состоянию на 2019-06 гг. Было решено, что Java 13 будет поставляться без исправления.
- Сообщение об ошибке Eclipse было улучшено, чтобы упомянуть реальную проблему.
- В Eclipse 2019-06 пользовательский интерфейс, используемый для Solution (3), был обновлен. Актуальную документацию можно найти в онлайн-справке.