We're trying to include a minimal JDK as part of a Windows installer for a Play 2.8.8 application, using the version of sbt-native-packager included with Play.
Alas, when packaging the application, we get the following error.
[error] Exception in thread "main" java.lang.module.FindException: Module paranamer not found, required by com.fasterxml.jackson.module.paranamer
[error] at java.base/java.lang.module.Resolver.findFail(Resolver.java:877)
[error] at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
[error] at java.base/java.lang.module.Resolver.resolve(Resolver.java:140)
[error] at java.base/java.lang.module.Configuration.resolve(Configuration.java:422)
[error] at java.base/java.lang.module.Configuration.resolve(Configuration.java:256)
[error] at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
[error] at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:603)
[error] at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:557)
[error] at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:533)
[error] at jdk.jdeps/com.sun.tools.jdeps.Main.run(Main.java:64)
[error] at jdk.jdeps/com.sun.tools.jdeps.Main$JDepsToolProvider.run(Main.java:73)
[error] at java.base/java.util.spi.ToolProvider.run(ToolProvider.java:137)
[error] at ru.eldis.toollauncher.ToolLauncher.runTool(ToolLauncher.java:68)
[error] at ru.eldis.toollauncher.ToolLauncher.lambda$main$1(ToolLauncher.java:33)
[error] at ru.eldis.toollauncher.ToolLauncher.main(ToolLauncher.java:48)
[error] java.lang.RuntimeException: Nonzero exit value: 1
[error] at scala.sys.package$.error(package.scala:30)
[error] at com.typesafe.sbt.packager.archetypes.jlink.JlinkPlugin$.runForOutput(JlinkPlugin.scala:212)
[error] at com.typesafe.sbt.packager.archetypes.jlink.JlinkPlugin$.$anonfun$runJavaTool$2(JlinkPlugin.scala:197
[error] at sbt.io.IO$.withTemporaryFile(IO.scala:534)
[error] at sbt.io.IO$.withTemporaryFile(IO.scala:544)
[error] at com.typesafe.sbt.packager.archetypes.jlink.JlinkPlugin$.runJavaTool(JlinkPlugin.scala:191)
[error] at com.typesafe.sbt.packager.archetypes.jlink.JlinkPlugin$.$anonfun$projectSettings$11(JlinkPlugin.scala:53)
[error] at com.typesafe.sbt.packager.archetypes.jlink.JlinkPlugin$.$anonfun$projectSettings$9(JlinkPlugin.scala:74)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] at sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] at sbt.Execute.work(Execute.scala:291)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[error] at java.base/java.lang.Thread.run(Thread.java:829)
[error] (jlinkModules) Nonzero exit value: 1
[error] Total time: 1 s, completed Sep 23, 2021, 11:57:58 AM
This error is a known problem with the JlinkPlugin, but we have already applied the recommended "fix" (the definition of the jlinkModulePath setting—see below) and it doesn't appear to resolve the problem. Running show jlinkModulePath within SBT results in the following:
[info] * C:\Users\Me\AppData\Local\Coursier\Cache\v1\https\repo1.maven.org\maven2\com\thoughtworks\paranamer\paranamer\2.8\paranamer-2.8.jar
so that looks OK.
Any suggestions?
Here's the relevant portions of our build.sbt file:
// Enable the Windows installer plugin.
//
// Note: This plugin requires that WiX Toolkit be installed to create the Windows installation
// script.
enablePlugins(WindowsPlugin)
// Enable the Java JLink plugin.
//
// This adds a Java installation to the web-application's installer file.
enablePlugins(JlinkPlugin)
// Package installation settings for Windows.
maintainer := "Me <me@emycompany.com>"
Windows / name := "MyProduct-" + version.value
Windows / packageSummary := "My web app"
Windows / packageDescription := """Windows installer for the My Web-Application."""
// WiX Toolkit product and upgrade GUIDs.
//
// DO NOT CHANGE THESE VALUES!
//
// NOTE: These are not the actual values. Doh!
wixProductId := "someproductguid"
wixProductUpgradeId := "someproductupgradeguid"
// Configure the Windows BAT file's JVM configuration file location.
batScriptConfigLocation := Some("%APP_HOME%\\conf\\jvmopts-bat")
// Configure JLink so that it knows where to find the "paranamer" module (that is not a typo: it really is "paranamer",
// not "parameter").
jlinkModulePath := {
// Get the full classpath with all the resolved dependencies.
fullClasspath.in(jlinkBuildImage).value
// Find the ones that have `paranamer` as their names.
.filter { item =>
item.get(moduleID.key).exists { modId =>
modId.name == "paranamer"
}
}
// Get raw `File` objects.
.map(_.data)
}
// Make jLink output a little smaller, by removing elements we do not require.
jlinkOptions ++= Seq(
"--no-header-files",
"--no-man-pages",
"--compress=2"
)