Автоматические модули не найдены в Eclipse 2018-12 при открытии проекта - PullRequest
0 голосов
/ 15 января 2019

Я хочу переключиться с Oracle JDK 8 на Open JDK 11, используя Eclipse 2018-12. У меня следующая ситуация:

В моей рабочей области Eclipse у меня есть основной проект maven, который называется пример с некоторыми зависимостями maven my_dependency_1, my_dependency_2 , которые также являются проектами maven в той же рабочей области. В настоящее время только пример является модульным (и поэтому содержит module-info.java ). Другие проекты являются немодульными и включены в pom.xml , а также необходимые (автоматические) модули в module-info.java из пример . Я узнал следующее:

Когда я закрываю все проекты Eclipse в моей рабочей области, кроме пример , тогда все (немодульные) файлы .jars корректно включаются из репозитория .m2 в путь к модулю как автоматические модули и мой пример проект работает нормально. Я могу убедиться в этом, посмотрев Запустить конфигурации> Аргументы> Показать командную строку .

Напротив, когда я открываю проекты с моими зависимостями в моей рабочей области, зависимости не включаются в путь к модулю, и, таким образом, пример проекта не запускается (в результате Произошла ошибка во время инициализации загрузочного слоя, java.lang.module.FindException: модуль my_dependency_1, ... не найден, требуется по примеру ).

Мой вопрос: Нужно ли мне преобразовывать все my_dependencies_1, ... из немодулярных в модульные зависимости, если я хочу открывать и работать с ними вместе с моими модульными пример проекта в моей рабочей области, или есть какой-либо вариант, который позволяет мне продолжать работать даже с немодулярными проектами зависимостей? Я ищу простое и чистое решение, а не «хакерство» с ручным добавлением прикольных вещей к аргументам запуска. Если это невозможно, я бы предпочел потратить некоторое время на преобразование каждой зависимости в модульную, с тем недостатком, что он больше не может использоваться в других проектах, все еще написанных для Java 8.

Спасибо за разъяснения:)

Вот базовый пример для демонстрации:

pom.xml (проекта пример )

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>example</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>mydependency</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

Example.java (проекта пример )

package example;
import mydependency.MyDependency;

public class Example {
    public static void main(String[] args) { 
        MyDependency.run();
    }
}

module-info.java (проекта пример )

open module example {
    requires mydependency;
}

pom.xml (проекта mydependency )

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>mydependency</artifactId>
  <version>1.0-SNAPSHOT</version>
</project>

MyDependency.java (проекта mydependency )

package mydependency;
public class MyDependency {
    public static void run() {
        System.out.println("run");
    }
}

Командная строка при запуске, если проект закрыт (работает правильно) :

C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-p "C:\me\workspace\example\target\classes;C:\me\.m2\repository\com\example\mydependency\1.0-SNAPSHOT\mydependency-1.0-SNAPSHOT.jar"
-m example/example.Example

Командная строка при запуске, если проект открыт (цель / классы mydependency отсутствуют) :

C:\me\jdk-11.0.1\bin\javaw.exe
-Dfile.encoding=UTF-8
-p "C:\me\workspace\example\target\classes"
-m example/example.Example

1 Ответ

0 голосов
/ 27 января 2019

Исходный проект не может быть автоматическим модулем, поскольку имя автоматического модуля получено из имени файла jar.

Вам нужно:

  • mvn installв каждой зависимости
  • Maven > Disable Workspace Resolution для каждого проекта, которая зависит от автоматического модуля (контекстное меню в проводнике пакетов)

Правки:

  • В качестве альтернативы, вместо отключения разрешения рабочей области, все проекты, содержащие автоматические модули, могут быть закрыты.
  • Люди, затронутые этим, могут отстаивать Eclipse Bug 543925 , где сотрудничество между m2e иJDT может выходить за пределы того, что указано в JPMS: m2e может сказать JDT, что будет именем автоматического модуля, если к данному проекту будет доступ из его файла JAR.За кулисами этой программы потребуется игнорировать разрешение рабочего пространства, чтобы JVM нашла нужный файл JAR.
...