gpt4 book ai didi

java - jlink:服务绑定(bind)链接了许多不必要的模块

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:56 27 4
gpt4 key购买 nike

我面临的问题是jlink的服务绑定(bind)选项链接了很多很多模块,似乎没有一个是必要的。省略服务绑定(bind)选项时,不会链接这些模块。

问题:

  • 问题 1:您在您的环境中看到过相同的行为吗?
  • 问题 2:这是错误还是期望的行为?
  • Q3:为什么所有这些模块都是链接在一起的?

我的应用程序:该应用程序是一个简单的服务,由一个接口(interface)、一个提供者和一个消费者组成,每个都打包到一个单独的模块中,称为 modService modProvidermodConsumer(详情如下)。

操作系统: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;
}

感谢任何帮助。

最佳答案

精简版

  • Q1:是的。
  • Q2:期望的行为
  • Q3:因为你用 --bind-services 告诉 jlink 😉

长版

默认 jlink 不绑定(bind)服务,以保持创建的运行时尽可能小。这随着 --bind-services 的变化而变化,the documentation

Link service provider modules and their dependencies.

这反射(reflect)了常规模块解析期间的行为,在解析所有依赖项之后,所有提供这些模块使用的服务的模块都包含在可读性图中。

您的情况也是如此,因此所有提供 java.basemodConsumermodService 使用的服务的模块都包含在图片。正如您所发现的,数量相当多。

解决方案

如果你想避免这种情况,你必须放弃 --bind-services 而是明确列出你想在你的图像中看到的提供者:

jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer,modProvider
--output myRuntime

关于java - jlink:服务绑定(bind)链接了许多不必要的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468111/

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