Почему моя служба Java 9 Module не имеет зарегистрированных реализаций? - PullRequest
0 голосов
/ 03 февраля 2019

Я изучаю модуль Java 9, читая книгу " Модульное программирование в Java 9 ".В главе 7 «Представление услуг» на странице 201 я следовал инструкциям книги, чтобы создать простой проект с использованием службы.Я опубликую код ниже, или вы можете посетить проект на github .

  1. service

имя модуля: packt.sortutil

полное имя класса: packt.util.SortUtil

public interface SortUtil {
    <T extends Comparable> List<T> sortList(List<T> list);
}

2.полное имя класса поставщиковдругой реализации.

потребитель

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);
}

Когда я запускаю потребителя, он должен быть: enter image description here

Обратите внимание на выделенную область, где найдено 2 реализации.Кроме того, имена сортируются по фамилии.

Но для моей программы, это:

2月 03, 2019 12:12:55 上午 packt.addressbook.Main main

INFO: Address book viewer application: Started

2月 03, 2019 12:12:56 上午 packt.addressbook.Main main

INFO: Address book viewer application: Completed

[Edsger Dijkstra, Raid Black]

Обратите внимание, что есть нет "Найден экземпляр SortUtil" и имена не отсортированы.Таким образом, создается впечатление, что в службе нет зарегистрированных реализаций.

Где это пошло не так?Спасибо.

1 Ответ

0 голосов
/ 04 февраля 2019

То, что я сделал * Предложение 1002 *

@ nullpointer полезно.Я использовал java --module-path out --module packt.addressbook/packt.addressbook.Main для отладки, увидеть путь к модулю и обнаружил:

root packt.addressbook file:///D:/ebooks/Modular%20Programming%20in%20Java%209/
ce-code/p205_Implementing_sorting_services/out/production/packt.addressbook/
packt.addressbook requires packt.sortutil file:///D:/ebooks/Modular%20Programmi
n%20Java%209/practice-code/p205_Implementing_sorting_services/out/production/pa
rtutil/
packt.addressbook requires java.logging jrt:/java.logging
packt.addressbook requires packt.contact file:///D:/ebooks/Modular%20Programmin
%20Java%209/practice-code/p205_Implementing_sorting_services/out/production/pac
tact/
packt.contact requires java.xml jrt:/java.xml
...

Модуль packt.sort.bubblesort и packt.sort.javasort не присутствовали в пути модуля.Затем я проверил выходную папку и увидел, что эти 2 модуля провайдера не были скомпилированы.Я выяснил, что причина в том, что эти 2 модуля не читаются другими модулями и поэтому опущены во время компиляции.

Когда я использовал команду D:\programs\java\jdk-11.0.2\bin\javac -d out --module-source-path .\*\src -m packt.addressbook, он ищет модули, от которых зависит модуль packt.addressbook, включаясервисный модуль packt.sortutil, но поскольку packt.sortutil и другие модули не зависят от 2 сервисных модулей, packt.sort.bubblesort и packt.sort.javasort, они опущены.На самом деле они зависят от сервисного модуля.


Решения

Поэтому я перешел к команде, чтобы вручную скомпилировать эти 2 модуля: javac -d out --module-source-path .\*\src -m packt.addressbook,packt.sort.bubblesort,packt.sort.javasort.И это исправлено.

Существует еще один проект , который использует maven для решения этой проблемы.POM модуля пользователя (packt.addressbook в моем примере) зависит от модуля поставщика (packt.sort.bubblesort и packt.sort.javasort в моем примере):

<dependency>
    <groupId>javax0</groupId>
    <artifactId>Provider</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

Я не уверен, является ли это лучшимхотя попрактикуйтесь.


Последующие действия

Если кто-то знает, как вручную добавлять модули для компиляции или автоматически обнаруживать модули провайдера, предоставляющие 'сервисный модуль для компиляциивнутри IDE, такой как IntelliJ IDEA, пожалуйста, дайте мне знать.

...