我有一个这样的项目:
\---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<ApiInterface> 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
错误,原本没问题
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
。uses com.foo.api.ApiInterface;
我使它工作的唯一方法是将main从未命名模块迁移到命名模块。
1.当未命名模块尝试与命名模块交互时, java 9是如何工作的?
2.是否有可能让它工作并保持主要的未命名模块?
更新 1.3 -添加了相关项目