我有一个这样的项目:
\---main
\---src
\---com.foo
\---UnnamedStart.java
\---api
\---src
\---com.foo.api
\---ApiInterface.java
\---module-info.java
\---impl
\---src
\---com.foo.impl
\---ApiInterfaceImpl.java
\---module-info.java
UnnamedStart.java实现是:
public static void main(String[] args) {
ServiceLoader services = ServiceLoader.load(ApiInterface.class);
...
}
请注意, main是未命名的模块。
api/src/module-info.java是:
module com.foo.api {
exports com.foo.api;
}
和impl/src/module-info.java是:
更新1.1 - 下面更新的代码见评论,添加requires
更新1.2 - 下面的代码更新, provides A with B更改provides B with A在创建问题时provides B with A错误,原来是好的
module com.foo.impl {
requires com.foo.api; //added (update 1.1)
provides com.foo.impl.ApiInterface
with com.foo.api.ApiInterfaceImpl; //vice versa (update 1.2)
}
当我在UnnamedStart.java运行我的代码时,我最终没有services元素。
我还尝试在com.foo.api.ApiInterface创建一个静态方法:
static List getInstances() {
ServiceLoader services = ServiceLoader.load(ApiInterface.class);
List list = new ArrayList<>();
services.iterator().forEachRemaining(list::add);
return list;
}
并在api/src/module-info.java添加行uses com.foo.api.ApiInterface; 但它给出了相同的结果(没有)。
我使其工作的唯一方法是将main从unnamed迁移到named模块。
1.当未命名模块尝试与命名模块交互时, java 9如何工作?
2.是否有可能使其工作并保持主要像未命名的模块?