Автоматические модули не найдены в Eclipse 2018-12 при открытии проекта
Я хочу переключиться с Oracle JDK 8 на Open JDK 11 с помощью Eclipse 2018-12. У меня следующая ситуация:
В моей рабочей области Eclipse у меня есть основной проект maven, который называется example с некоторыми зависимостями maven my_dependency_1, my_dependency_2, которые также являются maven-проектами в той же рабочей области. В настоящее время только пример является модульным (и, таким образом, содержит module-info.java). Другие проекты не являются модульными и включены в pom.xml, а также в обязательные (автоматические) модули в модуле-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 ответ
Исходный проект не может быть автоматическим модулем, потому что имя автоматического модуля происходит от имени файла jar.
Что вам нужно это:
mvn install
в каждой зависимостиMaven > Disable Workspace Resolution
для каждого проекта, который зависит от автоматического модуля (контекстное меню в Package Explorer)
Редактирование:
- Кроме того, вместо отключения разрешения рабочего пространства все проекты, содержащие автоматические модули, могут быть закрыты.
- Люди, затронутые этим, могут отстаивать Eclipse Bug 543925, где сотрудничество между m2e и JDT может выходить за рамки того, что указано в JPMS: m2e может сказать JDT, каким будет имя автоматического модуля, если к данному проекту будет открыт файл из его jar-файла. За кулисами этой программы потребуется игнорировать разрешение рабочей области, чтобы JVM нашла нужный файл JAR.