Eclipse смущен импортом («доступный из более чем одного модуля») - PullRequest
1 голос
/ 08 апреля 2019

При обращении к простым файлам .jar в Eclipse выдается сообщение об ошибке:

Пакет java.awt доступен из нескольких модулей: , java.desktop

Это происходит, например, когда javax.awt или javax.swing включены в файлы .jar.

Простейшим примером будет следующий:

package test;

import javax.swing.JDialog;

public class Test {
    public static void main(String[] args) {
        new JDialog();
    }
}

Добавление файла .jar в путь к классам только со структурой папок javax/swing (файлы не нужны) приведет к появлению ошибки. Я использую JDK 10/12 (ни один не работает). Установка соответствия компилятора на 1.8 заставляет все это работать снова. На другом компьютере с Eclipse 2018-09 это работает с соответствием компилятора, установленным на 10.

Я на Eclipse 2019-03, на недавно установленном (для целей тестирования) Eclipse 2018-09 работает нормально. Почему?

1 Ответ

2 голосов
/ 08 апреля 2019

Это , вызванное

  • a JAR на Classpath , который содержит пакет java.awt , который также существует в системной библиотеке , но
  • Системная библиотека JRE равен на Modulepath

В модульной системе платформы Java (JPMS) нельзя использовать один и тот же пакет в более чем одном модуле.Если используется Modulepath и Classpath , все в Classpath обрабатывается как модуль <unnamed> (в вашем случае пакет java.awt существует всистемный модуль java.desktop, а также через JAR на Classpath в модуле <unnamed>).

Поскольку системную библиотеку JRE нельзя постоянно перемещать из Modulepath до Classpath в Eclipse 2019-03 (насколько я знаю, это было возможно в предыдущих версиях, но вызывало другие проблемы; вы могли бы сообщить об этом в Eclipse), всеЯ знаю следующие обходные пути:

  • Установите соответствие компилятора на 1,8 (как вы уже упоминали)
  • Перестройте JAR в избегайте системы JavaИмена пакетов библиотеки внутри JAR (если используется отражение, могут потребоваться дополнительные изменения кода):
    • Если у вас есть исходный код, измените имена пакетов (например, измените пакет и подпакеты javaдо java_util и javax до javax_util) и заново создайте JAR
    • Если у вас есть только файлы .class, вам необходимо сначала декомпилировать файлы .class
...