gpt4 book ai didi

java - 为什么 ServiceLoader 不会从另一个模块加载任何实现?

转载 作者:行者123 更新时间:2023-12-01 19:19:57 26 4
gpt4 key购买 nike

我有一个使用 JPMS 功能的多模块 Maven 项目。消费者模块未加载提供者模块中存在的实现。

这是 Maven 项目结构:

ServiceLoaderExample
├── consumer
├── distribution
├── provider
├── service

界面TestService在“服务”模块中定义。实现是TestServiceImpl这是在“provider”模块中定义的。 “consumer”模块中的 main() 方法使用 ServiceLoader API 来加载 TestService 的实现。 。在“分发”模块中,我使用 maven-assesmbly-plugin 创建包含所有依赖项的 JAR。

因此,以下是相应的模块信息文件:

1 - “服务”模块(定义 org.example.service.TestService ):

module org.example.service {
exports org.example.service;
}

2 - “provider”模块(定义 org.example.provider.TestServiceImpl ):

module org.example.provider {
requires org.example.service;
provides org.example.service.TestService with org.example.provider.TestServiceImpl;
}

3 - “消费者”模块(使用 ServiceLoader API 获取 TestService 的实现):

module org.example.consumer {
requires org.example.service;
uses org.example.service.TestService;
}

我正在使用 maven-assesmbly-plugin,因此在构建 JAR 时,事情可能会搞砸。作为引用,这里是插件定义:

        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>org.example.consumer.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>

我正在使用 Java 13 和 Maven 3.6.3,并且我正在使用命令 java -jar distribution-1.0-SNAPSHOT-jar-with-dependencies.jar 运行该程序。 。我做错了什么?

最佳答案

我无法使用 uber-jar 让它工作,但是,使用 JLink 时一切都可以工作。因此决定只使用 JLink。

关于java - 为什么 ServiceLoader 不会从另一个模块加载任何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59369028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com