JPMS: Как позволить IntelliJ IDEA автоматически обнаруживать и компилировать модули поставщика для сервисного модуля? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть проект , разработанный с IntelliJ IDEA.Этот проект является демонстрацией для сервисных модулей Java 9.Я следовал книге "Модульное программирование в главе" Службы интродукции Java 9 ".

enter image description here

Исходный код

  1. сервисный модуль

имя модуля: 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 вопроса:

  1. Есть ли способ позволить IntelliJ IDEA автоматически обнаруживать и компилировать модули провайдера для сервисного модуля (в данном случае packt.sortutil)?

  2. По крайней мере, есть способ добавить эти 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 не зависит от модулей провайдера).Теперь все работает нормально, хотя я не уверен, что это лучшее решение .

enter image description here

...