jlink:服务绑定链接了许多不必要的模块
jlink: service binding links many unnecessary modules
我面临的问题是 jlink 的服务绑定选项链接了很多很多模块,其中 none 似乎是必需的。省略服务绑定选项时,不会链接这些模块。
问题:
- Q1:您是否在您的环境中看到相同的行为?
- 问题 2:这是错误还是期望的行为?
- Q3:为什么这些模块都是链接的?
我的应用程序:该应用程序是一个简单的服务,由一个接口、一个提供者和一个消费者组成,每个都打包到一个单独的模块中,称为 modService、modProvider、modConsumer(详情如下)。
OS: 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
我不知道为什么所有这些模块都链接在一起,因为提供者只是 returns 一个字符串,因此除了 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;
}
感谢任何帮助。
如 jlink
documentation 中所述。
--bind-services
Link service provider modules and their dependencies.
此外,其中的示例说明
option will link the modules resolved from root modules with service
binding; see the
Configuration.resolveAndBind
method.
根据您之前的命令,根模块和模块图中默认解析的模块是:
java.base@9
modConsumer
modService
此外,在使用 --bind-services
标志时列出的其他模块通过 java.base
模块解析。
I would expect that in addition the module modProvider
should be
linked
按照建议 ,您可以添加提供程序模块并确保它也在模块图中得到解析。
--add-modules modConsumer,modProvider
大声思考。 1. 当前寻找提供者的过程是迭代的。 2. 是否可以在显式查找服务提供者的同时指定要查找的模块?
简短版
- Q1:是的。
- Q2:期望的行为
- Q3:因为你告诉
jlink
所以用--bind-services
长版
默认情况下jlink
不绑定服务,以保持创建的运行时尽可能小。这随着 --bind-services
而改变,the documentation 说
Link service provider modules and their dependencies.
这反映了常规模块解析期间的行为,在解析所有依赖项之后,所有提供这些模块使用的服务的模块都包含在可读性图中。
你的情况也是如此,所以所有提供服务的模块都由 java.base、modConsumer 和 modService 包含在图像中。正如您所发现的那样,数量相当多。
解决方案
如果你想避免这种情况,你必须放弃 --bind-services
而不是明确列出你想在你的图像中看到的提供者:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer,modProvider
--output myRuntime
我面临的问题是 jlink 的服务绑定选项链接了很多很多模块,其中 none 似乎是必需的。省略服务绑定选项时,不会链接这些模块。
问题:
- Q1:您是否在您的环境中看到相同的行为?
- 问题 2:这是错误还是期望的行为?
- Q3:为什么这些模块都是链接的?
我的应用程序:该应用程序是一个简单的服务,由一个接口、一个提供者和一个消费者组成,每个都打包到一个单独的模块中,称为 modService、modProvider、modConsumer(详情如下)。
OS: 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
我不知道为什么所有这些模块都链接在一起,因为提供者只是 returns 一个字符串,因此除了 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;
}
感谢任何帮助。
如 jlink
documentation 中所述。
--bind-services
Link service provider modules and their dependencies.
此外,其中的示例说明
option will link the modules resolved from root modules with service binding; see the
Configuration.resolveAndBind
method.
根据您之前的命令,根模块和模块图中默认解析的模块是:
java.base@9
modConsumer
modService
此外,在使用 --bind-services
标志时列出的其他模块通过 java.base
模块解析。
I would expect that in addition the module
modProvider
should be linked
按照建议
--add-modules modConsumer,modProvider
大声思考。 1. 当前寻找提供者的过程是迭代的。 2. 是否可以在显式查找服务提供者的同时指定要查找的模块?
简短版
- Q1:是的。
- Q2:期望的行为
- Q3:因为你告诉
jlink
所以用--bind-services
长版
默认情况下jlink
不绑定服务,以保持创建的运行时尽可能小。这随着 --bind-services
而改变,the documentation 说
Link service provider modules and their dependencies.
这反映了常规模块解析期间的行为,在解析所有依赖项之后,所有提供这些模块使用的服务的模块都包含在可读性图中。
你的情况也是如此,所以所有提供服务的模块都由 java.base、modConsumer 和 modService 包含在图像中。正如您所发现的那样,数量相当多。
解决方案
如果你想避免这种情况,你必须放弃 --bind-services
而不是明确列出你想在你的图像中看到的提供者:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer,modProvider
--output myRuntime