我有一个这样的项目:
\---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
is:
public static void main(String[] args) {
ServiceLoader<ApiInterface> services = ServiceLoader.load(ApiInterface.class);
...
}
注意main是未命名的模块。
api/src/module-info.java
is:
module com.foo.api {
exports com.foo.api;
}
and impl/src/module-info.java
is:
更新1.1- 下面的代码已更新,请参阅评论,添加requires
更新1.2- 下面的代码已更新,provides A with B
变成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<ApiInterface> getInstances() {
ServiceLoader<ApiInterface> services = ServiceLoader.load(ApiInterface.class);
List<ApiInterface> list = new ArrayList<>();
services.iterator().forEachRemaining(list::add);
return list;
}
并添加api/src/module-info.java
line uses com.foo.api.ApiInterface;
但它给出了相同的结果(什么也没有)。
我让它发挥作用的唯一方法是迁移main从未命名模块到命名模块。
1. 怎样做java 9当未命名模块尝试与命名模块交互时工作?
2.是否有可能让它发挥作用并保持main比如未命名的模块?
更新1.3 - 添加了相关项目 https://github.com/akhmelov/service-loader-problem