8003562: Provide a command-line tool to find static dependencies

Mandy Chung mandy.chung at oracle.com
Tue Nov 27 15:18:04 PST 2012


As part of prepare for modules [1], this RFE is to provide a 
command-line tool in JDK8 so that developers can understand the static 
dependencies of their applications and libraries.As part of Project 
Jigsaw, a useful class analyzer [2] was developed that makes it very 
easy to identify the dependencies based on the classfile library thathas 
also been enhanced to support dependency analysis [3].

Inspired by the sample tool that Jon Gibbons developed, we propose this 
new command-line name as "jdeps".

$ ./bin/jdeps -h
Usage: jdeps <options> <files....>
where possible options include:
   -version                 Version information
   -classpath <path>        Specify where to find class files
   -v  --verbose            Print class-level dependencies
   -r  --reverse            Invert the dependencies in the output
   -p                       Restrict analysis to classes in this package
                            (may be given multiple times)
   -e  --regex              Restrict analysis to packages matching pattern
                            (-p and -e are exclusive)
   -P  --profile            Show profile or the file containing a package
   -d   --depth             Specify the depth of the transitive 
dependency analysis
                            Default depth is 1.  Set depth to 0 to 
traverse all dependencies.
   -all                     Show all classes and members with no breakdown

The jdeps tool shows package-level dependencies of the input files that 
can be .class files, a directory, or a JAR file.  Specify the depth for 
the transitive dependency analysis; otherwise, it only analyzes the 
input files.  jdeps -P option will show where the class/package comes 
from.  For Java SE API, it will show the Profile name (I implement a 
workaround for now until the profile work is in jdk8).  For JDK internal 
APIs, they will not be exported in modular world.  jdeps will indicate 
any usage of the JDK internal APIs in the output to help developers 
prepare for transitioning to modules.

See below for a few sample output.

Webrev at:
    http://cr.openjdk.java.net/~mchung/jdk8/webrevs/8003562/

The implementation classes for jdeps are in the langtools repo along 
with the com.sun.tools.classfile library.  I'm working on adding more 
unit tests.  I'd like to get this webrev out to begin the discussion and 
get review feedback.

Thanks
Mandy
[1] http://openjdk.java.net/jeps/162
[2] 
http://hg.openjdk.java.net/jigsaw/jigsaw/jdk/raw-file/543b0d24a920/make/tools/classanalyzer/classanalyzer.html
[3] http://bugs.sun.com/view_bug.do?bug_id=6907575

Sample Output

$./bin/jdeps demo/jfc/Notepad/Notepad.jar
<unnamed> (demo/jfc/Notepad/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

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

$ ./bin/jdeps -d 10 demo/jfc/Notepad/Notepad.jar
<unnamed> (demo/jfc/Notepad/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
java.security 
(/export/mchung/ws/jdeps-repo/build/macosx-x86_64/j2sdk-image/jre/lib/rt.jar)
     -> javax.crypto
javax.crypto 
(/export/mchung/ws/jdeps-repo/build/macosx-x86_64/j2sdk-image/jre/lib/jce.jar)
     -> java.io
     -> java.lang
     -> java.lang.reflect
     -> java.net
     -> java.nio
     -> java.security
     -> java.security.cert
     -> java.security.spec
     -> java.util
     -> java.util.concurrent
     -> java.util.jar
     -> java.util.regex
     -> java.util.zip
     -> sun.security.jca                         JDK internal API
     -> sun.security.util                        JDK internal API
javax.crypto.spec 
(/export/mchung/ws/jdeps-repo/build/macosx-x86_64/j2sdk-image/jre/lib/jce.jar)
     -> java.lang
     -> java.security.spec
     -> java.util



More information about the core-libs-dev mailing list