我正在通过阅读“ Modular Programming in Java 9”书来学习Java 9 Module。在第201页的第7章“服务介绍”中,我按照本书的步骤进行操作,以使用服务创建一个简单的项目。我将在下面发布代码,或者您可以在github上访问该项目。服务模块名称:packt.sortutil类全名:packt.util.SortUtilpublic interface SortUtil { <T extends Comparable> List<T> sortList(List<T> list);}2.提供者类全名:packt.util.impl.bubblesort.BubbleSortUtilImpl:码:package packt.util.impl.bubblesort;public class BubbleSortUtilImpl implements SortUtil...module-info.javamodule packt.sort.bubblesort { requires packt.sortutil; provides packt.util.SortUtil with packt.util.impl.bubblesort.BubbleSortUtilImpl;}还有packt.util.impl.javasort.JavaSortUtilImpl,只是不同实现的唯一区别。消费者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);}当我运行消费者时,应该是:请注意突出显示的区域,在该区域找到2个实现。同样,名称按姓氏排序。但是对于我的程序,它是:2月 03, 2019 12:12:55 上午 packt.addressbook.Main mainINFO: Address book viewer application: Started2月 03, 2019 12:12:56 上午 packt.addressbook.Main mainINFO: Address book viewer application: Completed[Edsger Dijkstra, Raid Black]请注意,没有“找到SortUtil的实例”,并且名称没有排序。因此,似乎没有在服务中注册任何实现。哪里出错了?谢谢。 最佳答案 我做了什么@nullpointer的建议很有帮助。我使用java --module-path out --module packt.addressbook/packt.addressbook.Main调试了see模块路径,并发现: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%20Programmin%20Java%209/practice-code/p205_Implementing_sorting_services/out/production/partutil/packt.addressbook requires java.logging jrt:/java.loggingpackt.addressbook requires packt.contact file:///D:/ebooks/Modular%20Programmin%20Java%209/practice-code/p205_Implementing_sorting_services/out/production/pactact/packt.contact requires java.xml jrt:/java.xml...模块路径中不存在模块packt.sort.bubblesort和packt.sort.javasort。然后我检查了输出文件夹,发现这两个提供程序模块未编译。我发现原因是这两个模块无法被任何其他模块读取,因此在编译过程中将其省略。当我使用命令D:\programs\java\jdk-11.0.2\bin\javac -d out --module-source-path .\*\src -m packt.addressbook时,它将查找模块packt.addressbook所依赖的模块,包括服务模块packt.sortutil,但是由于packt.sortutil和其他模块不依赖于两个服务模块packt.sort.bubblesort和,将其省略。实际上,它们取决于服务模块。解决方案因此,我更改为命令来手动编译这两个模块:packt.sort.javasort。现在已修复。还有另一个使用Maven来解决此问题的project。使用者模块(在我的示例中为javac -d out --module-source-path .\*\src -m packt.addressbook,packt.sort.bubblesort,packt.sort.javasort)的POM取决于提供程序模块(在我的示例中为packt.addressbook和packt.sort.bubblesort):<dependency> <groupId>javax0</groupId> <artifactId>Provider</artifactId> <version>1.0.0-SNAPSHOT</version></dependency>不过,我不确定这是否是最佳做法。跟进如果有人知道如何手动添加用于编译的模块,或者自动发现提供者模块,例如在IntelliJ IDEA之类的IDE中“提供”用于编译的服务模块,请告诉我。 07-24 09:53