JDEPS(1)

πŸ“¦ version 23.0.2.0, in opensuse-leap 16.0

πŸ’… JDEPS(1) β€” jdeps, the Java class dependency analyzer (JDK Commands) πŸ¦‹

🌸 NAME 🌸

jdeps β€” launch the Java class dependency analyzer πŸ’–

✨ SYNOPSIS ✨

jdeps [options] path ...
  • options β€” command-line options, bestie. For the full tea on the options you can use, peep these sections:
    • Possible Options
    • Module Dependence Analysis Options
    • Options to Filter Dependences
    • Options to Filter Classes to be Analyzed
  • path β€” a pathname to the .class file, directory, or JAR file to analyze πŸŽ€

πŸ¦‹ DESCRIPTION πŸ¦‹

Okay so the jdeps command is the main character for showing you the package-level or class-level dependencies of Java class files. The input class can be a path name to a .class file, a directory, a JAR file, or it can be a fully qualified class name, in which case it analyzes all class files. The options decide what the output looks like. By default, jdeps writes the dependencies to the system output. It can also generate the dependencies in DOT language β€” see the -dotoutput option πŸ‘‘

πŸ’… POSSIBLE OPTIONS πŸ’…

  • -?, -h, or --help β€” prints the help message.
  • -dotoutput dir or --dot-output dir β€” specifies the destination directory for DOT file output. If this option is specified, then the jdeps command generates one .dot file for each analyzed archive named archive-file-name.dot that lists the dependencies, and also a summary file named summary.dot that lists the dependencies among the archive files. Obsessed with the organization, honestly.
  • -s or -summary β€” prints a dependency summary only.
  • -v or -verbose β€” prints all class-level dependencies. This is equivalent to:
-verbose:class -filter:none
  • -verbose:package β€” prints package-level dependencies, excluding by default dependences within the same package.
  • -verbose:class β€” prints class-level dependencies, excluding by default dependences within the same archive.
  • -apionly or --api-only β€” restricts the analysis to APIs, for example, dependences from the signature of public and protected members of public classes, including field type, method parameter types, returned type, and checked exception types.
  • -jdkinternals or --jdk-internals β€” finds class-level dependences in the JDK internal APIs. By default, this option analyzes all classes specified in the --class-path option and input files unless you specified the -include option. You can’t use this option with the -p, -e, and -s options.
Warning: The JDK internal APIs are inaccessible. 🚨
  • -cp path, -classpath path, or --class-path path β€” specifies where to find class files.
  • --module-path module-path β€” specifies the module path.
  • --upgrade-module-path module-path β€” specifies the upgrade module path.
  • --system java-home β€” specifies an alternate system module path.
  • --add-modules module-name[, module-name...] β€” adds modules to the root set for analysis.
  • --multi-release version β€” specifies the version when processing multi-release JAR files. version should be an integer >=9 or base.
  • -q or -quiet β€” doesn’t show missing dependencies from -generate-module-info output.
  • -version or --version β€” prints version information.

πŸ”₯ MODULE DEPENDENCE ANALYSIS OPTIONS πŸ”₯

  • -m module-name or --module module-name β€” specifies the root module for analysis.
  • --generate-module-info dir β€” generates module-info.java under the specified directory. The specified JAR files will be analyzed. This option cannot be used with --dot-output or --class-path options. Use the --generate-open-module option for open modules.
  • --generate-open-module dir β€” generates module-info.java for the specified JAR files under the specified directory as open modules. This option cannot be used with the --dot-output or --class-path options.
  • --check module-name [, module-name...] β€” analyzes the dependence of the specified modules. It prints the module descriptor, the resulting module dependences after analysis, and the graph after transition reduction. It also identifies any unused qualified exports.
  • --list-deps β€” lists the module dependences and also the package names of JDK internal APIs (if referenced). This option transitively analyzes libraries on class path and module path if referenced. Use the --no-recursive option for non-transitive dependency analysis.
  • --list-reduced-deps β€” same as --list-deps without listing the implied reads edges from the module graph. If module M1 reads M2, and M2 requires transitive on M3, then M1 reading M3 is implied and is not shown in the graph.
  • --print-module-deps β€” same as --list-reduced-deps with printing a comma-separated list of module dependences. The output can be used by jlink --add-modules to create a custom image that contains those modules and their transitive dependences.
  • --ignore-missing-deps β€” ignore missing dependences. Not me ignoring my problems, this one is literally for missing dependences πŸ™ˆ

πŸŽ€ OPTIONS TO FILTER DEPENDENCES πŸŽ€

  • -p pkg_name, -package pkg_name, or --package pkg_name β€” finds dependences matching the specified package name. You can specify this option multiple times for different packages. The -p and -e options are mutually exclusive.
  • -e regex, -regex regex, or --regex regex β€” finds dependences matching the specified pattern. The -p and -e options are mutually exclusive.
  • --require module-name β€” finds dependences matching the given module name (may be given multiple times). The --package, --regex, and --require options are mutually exclusive.
  • -f regex or -filter regex β€” filters dependences matching the given pattern. If you give it multiple times, the last one will be selected.
  • -filter:package β€” filters dependences within the same package. This is the default.
  • -filter:archive β€” filters dependences within the same archive.
  • -filter:module β€” filters dependences within the same module.
  • -filter:none β€” no -filter:package and -filter:archive filtering. Filtering specified via the -filter option still applies.
  • --missing-deps β€” finds missing dependences. This option cannot be used with the -p, -e, and -s options.

🌈 OPTIONS TO FILTER CLASSES TO BE ANALYZED 🌈

  • -include regex β€” restricts analysis to the classes matching the pattern. This option filters the list of classes to be analyzed. It can be used together with -p and -e, which apply the pattern to the dependences.
  • -R or --recursive β€” recursively traverses all run-time dependences. The -R option implies -filter:none. If -p, -e, or -f options are specified, only the matching dependences are analyzed.
  • --no-recursive β€” do not recursively traverse dependences.
  • -I or --inverse β€” analyzes the dependences per other given options and then finds all artifacts that directly and indirectly depend on the matching nodes. This is equivalent to the inverse of the compile-time view analysis and the print dependency summary. This option must be used with the --require, --package, or --regex options.
  • --compile-time β€” analyzes the compile-time view of transitive dependencies, such as the compile-time view of the -R option. Analyzes the dependences per other specified options. If a dependency is found from a directory, a JAR file, or a module, all classes in that containing archive are analyzed.

πŸ“ EXAMPLE OF ANALYZING DEPENDENCIES πŸ“

The following example demonstrates analyzing the dependencies of the Notepad.jar file.

Linux and macOS:

$ jdeps demo/jfc/Notepad/Notepad.jar
Notepad.jar -> java.base
Notepad.jar -> java.desktop
Notepad.jar -> java.logging
   <unnamed> (Notepad.jar)
      -> java.awt
      -> java.awt.event
      -> java.beans
      -> java.io
      -> java.lang
      -> java.net
      -> java.util
      -> java.util.logging
      -> javax.swing
      -> javax.swing.border
      -> javax.swing.event
      -> javax.swing.text
      -> javax.swing.tree
      -> javax.swing.undo

Windows:

C:\Java\jdk1.9.0>jdeps demo\jfc\Notepad\Notepad.jar
Notepad.jar -> java.base
Notepad.jar -> java.desktop
Notepad.jar -> java.logging
   <unnamed> (Notepad.jar)
      -> java.awt
      -> java.awt.event
      -> java.beans
      -> java.io
      -> java.lang
      -> java.net
      -> java.util
      -> java.util.logging
      -> javax.swing
      -> javax.swing.border
      -> javax.swing.event
      -> javax.swing.text
      -> javax.swing.tree
      -> javax.swing.undo

πŸ’œ EXAMPLE USING THE --INVERSE OPTION πŸ’œ

$ jdeps --inverse --require java.xml.bind
Inverse transitive dependences on [java.xml.bind]
java.xml.bind <- java.se.ee
java.xml.bind <- jdk.xml.ws
java.xml.bind <- java.xml.ws <- java.se.ee
java.xml.bind <- java.xml.ws <- jdk.xml.ws
java.xml.bind <- jdk.xml.bind <- jdk.xml.ws

okay bye bestie, this iconic little page is from JDK 23, dated 2024, and it’s the JDEPS(1) manual πŸ«ΆπŸ’– slay responsibly!

πŸ“¦ where this page comes from