У меня есть проект , разработанный с IntelliJ IDEA.Этот проект является демонстрацией для сервисных модулей Java 9.Я следовал книге "Модульное программирование в главе" Службы интродукции Java 9 ".
Исходный код
- сервисный модуль
имя модуля: packt.sortutil
полное имя класса: packt.util.SortUtil
public interface SortUtil {
<T extends Comparable> List<T> sortList(List<T> list);
}
2.модуль поставщика 1
имя модуля: packt.sort.bubblesort
полное имя класса: packt.util.impl.bubblesort.BubbleSortUtilImpl
класс:
package packt.util.impl.bubblesort;
public class BubbleSortUtilImpl implements SortUtil
...
module-info.java:
module packt.sort.bubblesort {
requires packt.sortutil;
provides packt.util.SortUtil with packt.util.impl.bubblesort.BubbleSortUtilImpl;
}
Модуль поставщика 2 packt.sort.javasort
одинаков с единственным отличием другой реализации.
потребительский модуль
module-info.java:
module packt.addressbook {
requires packt.sortutil;
uses packt.util.SortUtil;
}
класс:
Iterable<SortUtil> sortUtils = ServiceLoader.load(SortUtil.class);
for (SortUtil sortUtil : sortUtils){
System.out.println("Found an instance of SortUtil");
sortUtil.sortList(contacts);
}
Проблема, обнаруженная при запускеОсновной класс в модуле потребителя: модули provider1 (packt.sort.bubblesort
) и provider2 (packt.sort.javasort
) не скомпилированы.Причина очевидна: поскольку вместо служебного модуля, считывающего модули поставщика, все наоборот. Компилятор не видел модули провайдера, поскольку их не читали никакие модули, поэтому они пропущены при компиляции.
У меня есть 2 вопроса:
Есть ли способ позволить IntelliJ IDEA автоматически обнаруживать и компилировать модули провайдера для сервисного модуля (в данном случае packt.sortutil)?
По крайней мере, есть способ добавить эти 2 вручнуюмодули провайдера во время компиляции?
Я пытался добавить --add-modules packt.sort.bubblesort
в Run > Edit Configurations > VM Options
, как предложено @nullpointer, но аргументы были добавлены в команду java
.Поскольку модуль не был скомпилирован, он показывает Module packt.sort.bubblesort not found
:
D:\programs\java\jdk-11.0.2\bin\java.exe --add-modules packt.sort.bubblesort "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3\lib\idea_rt.jar=49375:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3\bin" -Dfile.encoding=UTF-8 -p "D:\ebooks\Modular Programming in Java 9\practice-code\p205_Implementing_sorting_services\out\production\packt.addressbook;D:\ebooks\Modular Programming in Java 9\practice-code\p205_Implementing_sorting_services\out\production\packt.sortutil;D:\ebooks\Modular Programming in Java 9\practice-code\p205_Implementing_sorting_services\out\production\packt.contact" -m packt.addressbook/packt.addressbook.Main
Error occurred during initialization of boot layer
java.lang.module.FindException: Module packt.sort.bubblesort not found
Затем я вручную устанавливаю потребительский модуль (packt.addressbook
) в зависимости от модулей поставщика (packt.sort.bubblesort
и packt.sort.javasort
, выделенный цветомсиним цветом) внутри IntelliJ IDEA (только в IDE, с точки зрения потребительского модуля JPMS не зависит от модулей провайдера).Теперь все работает нормально, хотя я не уверен, что это лучшее решение .