简体   繁体   中英

jdeps does not add jdk.random when using RandomGenerator.getDefault()

I have a Java 17 application which uses RandomGenerator.getDefault() in it. When I use jdeps to create a minified JRE for it, it does not add jdk.random , so the JRE created by jlink cannot run the application. Is there something I missed?

The RandomGenerator interface is in the module java.base , which can not depend on any other module, including jdk.random .

Instead it uses the ServiceLoader API to find implementations of RandomGenerator . The jdk.random module provides several implementations of the RandomGenerator interface:

> java --describe-module jdk.random
jdk.random@19
...
provides java.util.random.RandomGenerator with jdk.random.L32X64MixRandom jdk.random.L64X128MixRandom jdk.random.L64X128StarStarRandom jdk.random.L64X256MixRandom jdk.random.L64X1024MixRandom jdk.random.L128X128MixRandom jdk.random.L128X256MixRandom jdk.random.L128X1024MixRandom jdk.random.Xoroshiro128PlusPlus jdk.random.Xoshiro256PlusPlus
...

However, since there is no explicit dependency from java.base to jdk.random , it is not included automatically when you include java.base .

Modules that implement services have to be included manually using --add-modules when running jlink instead.

You can use jlink 's --suggest-providers option to get a list of modules that implement a service:

> jlink --suggest-providers java.util.random.RandomGenerator

Suggested providers:
  java.base provides java.util.random.RandomGenerator used by java.base
  jdk.random provides java.util.random.RandomGenerator used by java.base

(There's also the --bind-services flag, but that will include ALL service implementations, which is probably not what you want)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM