我面临的问题是 jlink 的服务绑定选项链接了很多很多模块,它们似乎都不是必需的。当省略服务绑定选项时,这些模块不会链接。
问题:
- Q1:你在你的环境中看到同样的行为吗?
- Q2:这是错误还是期望的行为?
- Q3:为什么所有这些模块都链接在一起?
我的应用程序:该应用程序是一个简单的服务,由一个接口、一个提供者和一个消费者组成,每个都打包到一个单独的模块中,称为modService、modProvider、modConsumer(详细信息如下)。
操作系统:Windows 10
Jlink without --bind-services
产生预期结果:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer
--output myRuntime
java --list-modules
java.base@9
modConsumer
modService
当应用该--bind-services
选项时,我希望另外模块modProvider应该被链接。但是,看看会发生什么(三个自定义模块在最后):
jlink --module-path "mods;%JAVA_HOME%\jmods"
--bind-services
--add-modules modConsumer
--output myRuntime
java --list-modules
java.base@9
java.compiler@9
java.datatransfer@9
java.desktop@9
java.logging@9
java.management@9
java.management.rmi@9
java.naming@9
java.prefs@9
java.rmi@9
java.scripting@9
java.security.jgss@9
java.security.sasl@9
java.smartcardio@9
java.xml@9
java.xml.crypto@9
jdk.accessibility@9
jdk.charsets@9
jdk.compiler@9
jdk.crypto.cryptoki@9
jdk.crypto.ec@9
jdk.crypto.mscapi@9
jdk.deploy@9
jdk.dynalink@9
jdk.internal.opt@9
jdk.jartool@9
jdk.javadoc@9
jdk.jdeps@9
jdk.jfr@9
jdk.jlink@9
jdk.localedata@9
jdk.management@9
jdk.management.cmm@9
jdk.management.jfr@9
jdk.naming.dns@9
jdk.naming.rmi@9
jdk.scripting.nashorn@9
jdk.security.auth@9
jdk.security.jgss@9
jdk.unsupported@9
jdk.zipfs@9
modConsumer
modProvider
modService
我不知道为什么所有这些模块都被链接,因为提供者只返回一个字符串,因此不需要除 java.base 之外的其他 jdk 模块。
以下是 Java 工件:
package test.service;
public interface HelloService {
public String sayHello();
}
package test.provider;
import test.service;
public class HelloProvider implements HelloService {
@Override public String sayHello() { return "Hello!"; }
}
package test.consumer;
import test.service;
import java.util.ServiceLoader;
public class HelloConsumer {
public static void main(String... args) {
ServiceLoader.load(HelloService.class).forEach(s -> System.out.println(s.sayHello()));
}
}
module modService {
exports test.service;
}
module modProvider {
requires modService;
provides test.service.HelloService with test.provider.HelloProvider;
}
module modConsumer {
requires modService;
uses test.service.HelloService;
}
任何帮助表示赞赏。