Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8324262

`jdeps --print-module-deps *.jar` fails when a jar requires an automatic module

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      OS: Debian testing (Trixie)

      $ java -version
      openjdk version "21.0.1" 2023-10-17
      OpenJDK Runtime Environment (build 21.0.1+12-Debian-3)
      OpenJDK 64-Bit Server VM (build 21.0.1+12-Debian-3, mixed mode, sharing)

      A DESCRIPTION OF THE PROBLEM :
      jdeps has the convenience option `--print-module-deps` in order to determine which modules to add to a jlink image to run an application. Concretely one gathers all jars/dependencies of an application in a folder and executes `jdeps --print-module-deps jars/*.jar`. `*.jar` must be seen as the expansion of all `.jar` files present in the `jars` directory. The reason to put all jars as an argument instead of a "root jar" is to also let jdeps analyze runtime dependencies too, like services, which will not be reached via the root jar.

      When a jar in `*.jar` is a modularized jar and depends on automatic modules (jars also present in *.jar), `jdeps --print-module-deps` will fail. It is possible to make the command succeed by putting the non-modularized jars on the module path, but then it becomes less convenient to figure out which modules to add to the jlink image, because jdeps will not perform it's analysis on jars on the module path, only on jars provided as argument. Hence one has to perform several manually crafted jdeps commands to get to the desired result.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      #!/bin/bash
      #
      # There doesn't seem to be a possibility to upload an example project.
      # I've encoded an example project in base64 instead. Just copy/paste
      # this script into a file and execute it to reproduce the issue. It
      # will run jdeps on two jars lib.jar and main.jar. main.jar is a
      # modularized jar requiring the automatic module "lib", which is
      # contained in lib.jar.
      # The archive data contains the jars as well as the source code.

      ARCHIVE_DATA='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
      QEBAQEBAQHAr/gfA29Q2AFAAAA=='

      echo -n "$ARCHIVE_DATA" | base64 -d >jdeps_bug.tar.gz
      tar xzf jdeps_bug.tar.gz
      cd jdeps_bug/out
      jdeps --print-module-deps main.jar lib.jar


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      java.base
      ACTUAL -
      Exception in thread "main" java.lang.module.FindException: Module lib not found, required by main
              at java.base/java.lang.module.Resolver.findFail(Resolver.java:892)
              at java.base/java.lang.module.Resolver.resolve(Resolver.java:192)
              at java.base/java.lang.module.Resolver.resolve(Resolver.java:141)
              at java.base/java.lang.module.Configuration.resolve(Configuration.java:420)
              at java.base/java.lang.module.Configuration.resolve(Configuration.java:254)
              at jdk.jdeps/com.sun.tools.jdeps.JdepsConfiguration$Builder.build(JdepsConfiguration.java:564)
              at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.buildConfig(JdepsTask.java:607)
              at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:561)
              at jdk.jdeps/com.sun.tools.jdeps.JdepsTask.run(JdepsTask.java:537)
              at jdk.jdeps/com.sun.tools.jdeps.Main.main(Main.java:50)

      ---------- BEGIN SOURCE ----------
      Cf. "Steps to Reproduce"
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      jdeps --module-path lib.jar --print-module-deps main.jar
      +
      jdeps --print-module-deps lib.jar

      I understand both will print java.base, but if lib.jar would depend on another java module, e.g. java.xml, java.xml would not be printed in the first jdeps invocation.

      FREQUENCY : always


            mchung Mandy Chung (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: