use*_*513 8 java jlink java-platform-module-system java-9
我面临的问题是jlink的服务绑定选项链接了许多模块,似乎没有必要.省略服务绑定选项时,不链接这些模块.
问题:
我的应用程序:应用程序是一个简单的服务,由一个接口,一个提供者和一个使用者组成,每个服务都打包到一个单独的模块中,称为modService,modProvider,modConsumer(详见下文).
操作系统:Windows 10
Jlink 没有 --bind-services产生预期的结果:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer
--output myRuntime
java --list-modules
java.base@9
modConsumer
modService
Run Code Online (Sandbox Code Playgroud)
当应用该--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
Run Code Online (Sandbox Code Playgroud)
我不知道为什么所有这些模块都被链接,因为提供者只返回一个字符串,因此不需要其他jdk模块而不是java.base.
以下是Java工件:
package test.service;
public interface HelloService {
public String sayHello();
}
Run Code Online (Sandbox Code Playgroud)
package test.provider;
import test.service;
public class HelloProvider implements HelloService {
@Override public String sayHello() { return "Hello!"; }
}
Run Code Online (Sandbox Code Playgroud)
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
如jlink文档中所述。的
--bind-services
Run Code Online (Sandbox Code Playgroud)
链接服务提供者模块及其依赖性。
此外,同一示例说明了
选项将通过服务绑定链接从根模块解析的模块;见
Configuration.resolveAndBind方法。
根据您先前的命令,默认情况下,根模块和在模块图中解析的模块是:
java.base@9
modConsumer
modService
Run Code Online (Sandbox Code Playgroud)
此外,--bind-services通过标志解析列出的其他使用标志的java.base模块。
我希望另外模块
modProvider应该链接
根据nicolai的建议,您可以添加提供者模块并确保在模块图中也已解决该问题。
--add-modules modConsumer,modProvider
Run Code Online (Sandbox Code Playgroud)
把想法大声说出来。1.当前寻找提供者的过程是迭代的。2.是否可以在明确查找服务提供商时指定要为其寻找模块的模块?
jlink过--bind-services 默认情况下jlink,不绑定服务,以使创建的运行时尽可能小。随的变化--bind-services,文档说
链接服务提供者模块及其依赖性。
这反映了常规模块解析过程中的行为,在解析所有依赖性之后,提供这些模块使用的服务的所有模块都包含在可读性图中。
在您的情况下也会发生同样的情况,因此映像中包括了所有提供java.base,modConsumer和modService使用的服务的模块。如您所知,这很多。
如果要避免这种情况,则必须放弃--bind-services,而要明确列出要在映像中看到的提供程序:
jlink --module-path "mods;%JAVA_HOME%\jmods"
--add-modules modConsumer,modProvider
--output myRuntime
Run Code Online (Sandbox Code Playgroud)