我用intellij idea开发了这个项目。这个项目是Java9服务模块的一个演示。我在Java9的介绍服务一章中学习了模块化编程这本书。
源代码
服务模块
课程名称: packt.sortutil
班级全名: packt.util.SortUtil
```
public interface SortUtil {
List sortList(List 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 sortUtils = ServiceLoader.load(SortUtil.class);
for (SortUtil sortUtil : sortUtils){
System.out.println("Found an instance of SortUtil");
sortUtil.sortList(contacts);
}
在consumer模块中运行主类时发现的问题是provider1( `packt.sort.bubblesort` )和提供者2( `packt.sort.javasort` )未编译模块。原因很明显:因为不是服务模块读取提供者模块,而是相反。编译器没有看到提供程序模块,因为没有模块读取它们,所以在编译时会忽略它们。
我有两个问题:
有没有办法让intellij idea自动发现并编译服务模块的提供者模块(在本例中是packt.sortutil)?
是否至少有一种方法可以在编译期间手动添加这两个提供程序模块?
我试着添加 `--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而言,使用者模块不依赖于提供者模块)。虽然我不确定这是不是最好的解决办法,但现在它还可以用。
![](https://i.stack.imgur.com/ZGBlr.png)
暂无答案!
目前还没有任何答案,快来回答吧!