{"id":8626,"date":"2017-07-23T18:15:11","date_gmt":"2017-07-23T16:15:11","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=8626"},"modified":"2022-06-10T13:01:46","modified_gmt":"2022-06-10T11:01:46","slug":"quicktest-jdeps-java-dependency-analysis-tool","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=8626","title":{"rendered":"Quicktest: JDeps (Java Dependency Analysis Tool)"},"content":{"rendered":"<p>Mit Java 8 wird im bin Verzeichnis auch das <strong><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/jdeps.html\" target=\"_blank\" rel=\"noopener\">JDeps<\/a><\/strong> Tool ausgeliefert. Dieses Tool erm\u00f6glicht eine statische Kodeanalyse von der Kommandozeile. Es kann die statischen Abh\u00e4ngigkeiten von Klassen und Jars aufzeigen und auch eine Abh\u00e4ngigkeitsgraphen generieren. So ist man dann f\u00fcr <a href=\"https:\/\/www.oracle.com\/splash\/openjdk.java.net\/maintenance\" target=\"_blank\" rel=\"noopener\">Java 9<\/a> vorbereitet.<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps.png\" alt=\"\" width=\"2732\" height=\"2048\" class=\"aligncenter size-full wp-image-8636\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps.png 2732w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps-300x225.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps-768x576.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Jdeps-1024x768.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Das wollen wir einmal ausprobieren. Dazu hole ich mir f\u00fcr mein Testprojekt erst einmal alle Jars und untersuche dann das JUnit 4.12.<\/p>\n<p>Also in der pom.xml folgendes Plugin erg\u00e4nze und ein &#8222;<strong>mvn package<\/strong>&#8220; ausf\u00fchren:<!--more--><\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.6.1&lt;\/version&gt;\r\n\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t&lt;source&gt;${java.version}&lt;\/source&gt;\r\n\t\t\t\t\t&lt;target&gt;${java.version}&lt;\/target&gt;\r\n\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-dependency-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.0.1&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;copy-dependencies&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;phase&gt;package&lt;\/phase&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;copy-dependencies&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t\t\t&lt;outputDirectory&gt;${project.build.directory}\/alternateLocation&lt;\/outputDirectory&gt;\r\n\t\t\t\t\t\t\t&lt;overWriteReleases&gt;false&lt;\/overWriteReleases&gt;\r\n\t\t\t\t\t\t\t&lt;overWriteSnapshots&gt;false&lt;\/overWriteSnapshots&gt;\r\n\t\t\t\t\t\t\t&lt;overWriteIfNewer&gt;true&lt;\/overWriteIfNewer&gt;\r\n\t\t\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\r\n\t\t\t&lt;\/plugin&gt;<\/pre>\n<p>So dann haben wir diese Jars:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36.png\" alt=\"\" width=\"1215\" height=\"913\" class=\"aligncenter size-full wp-image-8627\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36.png 1215w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36-300x225.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36-768x577.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/Bildschirmfoto-2017-07-23-um-17.02.36-1024x769.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Wir schauen uns nun mal kurz die Onlinehilfe zu dem Tool mit <strong>jdeps -h<\/strong> an:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nUsage: jdeps &lt;options&gt; &lt;classes...&gt;\r\nwhere &lt;classes&gt; can be a pathname to a .class file, a directory, a JAR file,\r\nor a fully-qualified class name.  Possible options include:\r\n  -dotoutput &lt;dir&gt;                   Destination directory for DOT file output\r\n  -s           -summary              Print dependency summary only\r\n  -v           -verbose              Print all class level dependencies\r\n                                     Equivalent to -verbose:class -filter:none.\r\n  -verbose:package                   Print package-level dependencies excluding\r\n                                     dependencies within the same package by default\r\n  -verbose:class                     Print class-level dependencies excluding\r\n                                     dependencies within the same package by default\r\n  -cp &lt;path&gt;   -classpath &lt;path&gt;     Specify where to find class files\r\n  -p &lt;pkgname&gt; -package &lt;pkgname&gt;    Finds dependences matching the given package name\r\n                                     (may be given multiple times)\r\n  -e &lt;regex&gt;   -regex &lt;regex&gt;        Finds dependences matching the given pattern\r\n                                     (-p and -e are exclusive)\r\n  -f &lt;regex&gt;   -filter &lt;regex&gt;       Filter dependences matching the given pattern\r\n                                     If given multiple times, the last one will be used.\r\n  -filter:package                    Filter dependences within the same package (default)\r\n  -filter:archive                    Filter dependences within the same archive\r\n  -filter:none                       No -filter:package and -filter:archive filtering\r\n                                     Filtering specified via the -filter option still applies.\r\n  -include &lt;regex&gt;                   Restrict analysis to classes matching pattern\r\n                                     This option filters the list of classes to\r\n                                     be analyzed.  It can be used together with\r\n                                     -p and -e which apply pattern to the dependences\r\n  -P           -profile              Show profile or the file containing a package\r\n  -apionly                           Restrict analysis to APIs i.e. dependences\r\n                                     from the signature of public and protected\r\n                                     members of public classes including field\r\n                                     type, method parameter types, returned type,\r\n                                     checked exception types etc\r\n  -R           -recursive            Recursively traverse all dependencies.\r\n                                     The -R option implies -filter:none.  If -p, -e, -f\r\n                                     option is specified, only the matching dependences\r\n                                     are analyzed.\r\n  -jdkinternals                      Finds class-level dependences on JDK internal APIs.\r\n                                     By default, it analyzes all classes on -classpath\r\n                                     and input files unless -include option is specified.\r\n                                     This option cannot be used with -p, -e and -s options.\r\n                                     WARNING: JDK internal APIs may not be accessible in\r\n                                     the next release.\r\n  -version                           Version information<\/pre>\n<p>Nun \u00f6ffnen wir eine Kommandozeile im Verzeichnis <strong>target\/alternateLocation<\/strong> und f\u00fchren unter Java 1.8 den folgenden Befehl aus (hier Mac OS X). Den Punkt f\u00fcr das aktuelle Verzeichnis nicht vergessen.<\/p>\n<p>\/Library\/Java\/JavaVirtualMachines\/jdk1.8.0_131.jdk\/Contents\/Home\/bin\/<strong>jdeps -dotoutput . junit-4.12.jar<\/strong><\/p>\n<p>Als Ergebnis erhalten wir zwei Dateien. Die <strong>summary.dot<\/strong><\/p>\n<pre class=\"lang:default decode:true \" >\r\nsummary.dot \r\ndigraph \"summary\" {\r\n  \"junit-4.12.jar\"                                   -&gt; \"not found\";\r\n  \"junit-4.12.jar\"                                   -&gt; \"rt.jar\";\r\n}\r\n<\/pre>\n<p>und die <strong>unit-4.12.jar.dot<\/strong> mit allen Abh\u00e4ngigkeiten:<\/p>\n<pre class=\"lang:default decode:true \" >digraph \"junit-4.12.jar\" {\r\n    \/\/ Path: junit-4.12.jar\r\n   \"junit.extensions\"                                 -&gt; \"java.lang\";\r\n   \"junit.extensions\"                                 -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"junit.framework\"                                  -&gt; \"java.io\";\r\n   \"junit.framework\"                                  -&gt; \"java.lang\";\r\n   \"junit.framework\"                                  -&gt; \"java.lang.annotation\";\r\n   \"junit.framework\"                                  -&gt; \"java.lang.reflect\";\r\n   \"junit.framework\"                                  -&gt; \"java.util\";\r\n   \"junit.framework\"                                  -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"junit.framework\"                                  -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"junit.framework\"                                  -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"junit.framework\"                                  -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"junit.framework\"                                  -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"junit.runner\"                                     -&gt; \"java.io\";\r\n   \"junit.runner\"                                     -&gt; \"java.lang\";\r\n   \"junit.runner\"                                     -&gt; \"java.lang.reflect\";\r\n   \"junit.runner\"                                     -&gt; \"java.text\";\r\n   \"junit.runner\"                                     -&gt; \"java.util\";\r\n   \"junit.runner\"                                     -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"junit.textui\"                                     -&gt; \"java.io\";\r\n   \"junit.textui\"                                     -&gt; \"java.lang\";\r\n   \"junit.textui\"                                     -&gt; \"java.text\";\r\n   \"junit.textui\"                                     -&gt; \"java.util\";\r\n   \"junit.textui\"                                     -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"junit.textui\"                                     -&gt; \"junit.runner (junit-4.12.jar)\";\r\n   \"org.junit\"                                        -&gt; \"java.lang\";\r\n   \"org.junit\"                                        -&gt; \"java.lang.annotation\";\r\n   \"org.junit\"                                        -&gt; \"java.util\";\r\n   \"org.junit\"                                        -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit\"                                        -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit\"                                        -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental\"                           -&gt; \"java.io\";\r\n   \"org.junit.experimental\"                           -&gt; \"java.lang\";\r\n   \"org.junit.experimental\"                           -&gt; \"java.util.concurrent\";\r\n   \"org.junit.experimental\"                           -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.experimental\"                           -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental\"                           -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"java.lang\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"java.lang.annotation\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"java.util\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.categories\"                -&gt; \"org.junit.validator (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"java.io\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"java.lang\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"java.lang.annotation\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"java.util\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.internal.requests (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental.max\"                       -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"java.io\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"java.lang\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"java.util\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.experimental.results\"                   -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.experimental.runners\"                   -&gt; \"java.lang\";\r\n   \"org.junit.experimental.runners\"                   -&gt; \"java.lang.reflect\";\r\n   \"org.junit.experimental.runners\"                   -&gt; \"java.util\";\r\n   \"org.junit.experimental.runners\"                   -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental.runners\"                   -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"java.lang\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"java.lang.annotation\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"java.lang.reflect\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"java.util\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"org.junit.experimental.theories.internal (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories\"                  -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"java.lang\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"java.lang.annotation\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"java.lang.reflect\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"java.util\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"org.junit.experimental.theories (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories.internal\"         -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.experimental.theories.suppliers\"        -&gt; \"java.lang\";\r\n   \"org.junit.experimental.theories.suppliers\"        -&gt; \"java.lang.annotation\";\r\n   \"org.junit.experimental.theories.suppliers\"        -&gt; \"java.util\";\r\n   \"org.junit.experimental.theories.suppliers\"        -&gt; \"org.junit.experimental.theories (junit-4.12.jar)\";\r\n   \"org.junit.internal\"                               -&gt; \"java.io\";\r\n   \"org.junit.internal\"                               -&gt; \"java.lang\";\r\n   \"org.junit.internal\"                               -&gt; \"java.lang.annotation\";\r\n   \"org.junit.internal\"                               -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal\"                               -&gt; \"java.text\";\r\n   \"org.junit.internal\"                               -&gt; \"java.util\";\r\n   \"org.junit.internal\"                               -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit.internal\"                               -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.internal\"                               -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.internal\"                               -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.internal\"                               -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"java.lang\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"java.lang.annotation\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"java.util\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.internal.builders\"                      -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.internal.matchers\"                      -&gt; \"java.io\";\r\n   \"org.junit.internal.matchers\"                      -&gt; \"java.lang\";\r\n   \"org.junit.internal.matchers\"                      -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal.matchers\"                      -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit.internal.matchers\"                      -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"java.lang\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"java.util\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"org.junit.internal.builders (junit-4.12.jar)\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.internal.requests\"                      -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"java.lang\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"java.lang.annotation\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"java.util\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"java.util.concurrent\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"junit.extensions (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners\"                       -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"java.lang\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"java.util\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.model\"                 -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"java.lang\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"java.lang.annotation\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"java.lang.reflect\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"java.util\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"org.junit.rules (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.rules\"                 -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"java.lang\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"java.lang.management\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"java.util\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"java.util.concurrent\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.internal.runners.statements\"            -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.matchers\"                               -&gt; \"java.lang\";\r\n   \"org.junit.matchers\"                               -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit.matchers\"                               -&gt; \"org.hamcrest.core (not found)\";\r\n   \"org.junit.matchers\"                               -&gt; \"org.junit.internal.matchers (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"java.io\";\r\n   \"org.junit.rules\"                                  -&gt; \"java.lang\";\r\n   \"org.junit.rules\"                                  -&gt; \"java.lang.management\";\r\n   \"org.junit.rules\"                                  -&gt; \"java.util\";\r\n   \"org.junit.rules\"                                  -&gt; \"java.util.concurrent\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.hamcrest (not found)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.internal.matchers (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.internal.runners.statements (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.matchers (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.rules\"                                  -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.io\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.lang\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.lang.annotation\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.lang.reflect\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.util\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.util.concurrent\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.util.concurrent.atomic\";\r\n   \"org.junit.runner\"                                 -&gt; \"java.util.regex\";\r\n   \"org.junit.runner\"                                 -&gt; \"junit.framework (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.internal.builders (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.internal.requests (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.runner\"                                 -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.runner.manipulation\"                    -&gt; \"java.lang\";\r\n   \"org.junit.runner.manipulation\"                    -&gt; \"java.util\";\r\n   \"org.junit.runner.manipulation\"                    -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"java.io\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"java.lang\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"java.lang.annotation\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"java.util\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"java.util.concurrent\";\r\n   \"org.junit.runner.notification\"                    -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"java.lang\";\r\n   \"org.junit.runners\"                                -&gt; \"java.lang.annotation\";\r\n   \"org.junit.runners\"                                -&gt; \"java.lang.reflect\";\r\n   \"org.junit.runners\"                                -&gt; \"java.text\";\r\n   \"org.junit.runners\"                                -&gt; \"java.util\";\r\n   \"org.junit.runners\"                                -&gt; \"java.util.concurrent\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal.builders (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal.runners.rules (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.internal.runners.statements (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.rules (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.runner.manipulation (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.runners.parameterized (junit-4.12.jar)\";\r\n   \"org.junit.runners\"                                -&gt; \"org.junit.validator (junit-4.12.jar)\";\r\n   \"org.junit.runners.model\"                          -&gt; \"java.lang\";\r\n   \"org.junit.runners.model\"                          -&gt; \"java.lang.annotation\";\r\n   \"org.junit.runners.model\"                          -&gt; \"java.lang.reflect\";\r\n   \"org.junit.runners.model\"                          -&gt; \"java.util\";\r\n   \"org.junit.runners.model\"                          -&gt; \"java.util.concurrent\";\r\n   \"org.junit.runners.model\"                          -&gt; \"org.junit (junit-4.12.jar)\";\r\n   \"org.junit.runners.model\"                          -&gt; \"org.junit.internal (junit-4.12.jar)\";\r\n   \"org.junit.runners.model\"                          -&gt; \"org.junit.internal.runners (junit-4.12.jar)\";\r\n   \"org.junit.runners.model\"                          -&gt; \"org.junit.internal.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.runners.model\"                          -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"java.lang\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"java.lang.annotation\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"java.lang.reflect\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"java.util\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"org.junit.runner (junit-4.12.jar)\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"org.junit.runner.notification (junit-4.12.jar)\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"org.junit.runners (junit-4.12.jar)\";\r\n   \"org.junit.runners.parameterized\"                  -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n   \"org.junit.validator\"                              -&gt; \"java.lang\";\r\n   \"org.junit.validator\"                              -&gt; \"java.lang.annotation\";\r\n   \"org.junit.validator\"                              -&gt; \"java.util\";\r\n   \"org.junit.validator\"                              -&gt; \"java.util.concurrent\";\r\n   \"org.junit.validator\"                              -&gt; \"org.junit.runners.model (junit-4.12.jar)\";\r\n}<\/pre>\n<p>Das wollen wir jetzt noch graphisch darstellen:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nfdp -T png -o junit-4.12.png junit-4.12.jar.dot\r\n<\/pre>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12.png\" alt=\"\" width=\"4428\" height=\"3511\" class=\"aligncenter size-full wp-image-8629\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12.png 4428w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12-300x238.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12-768x609.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/junit-4.12-1024x812.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Oder kurz:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nfdp -T png -o summary.png summary.dot\r\n<\/pre>\n<p>Das Ergebnis:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/summary.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2017\/07\/summary.png\" alt=\"\" width=\"268\" height=\"184\" class=\"aligncenter size-full wp-image-8630\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit Java 8 wird im bin Verzeichnis auch das JDeps Tool ausgeliefert. Dieses Tool erm\u00f6glicht eine statische Kodeanalyse von der Kommandozeile. Es kann die statischen Abh\u00e4ngigkeiten von Klassen und Jars aufzeigen und auch eine Abh\u00e4ngigkeitsgraphen generieren. So ist man dann f\u00fcr Java 9 vorbereitet. Das wollen wir einmal ausprobieren. Dazu hole ich mir f\u00fcr mein &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=8626\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eQuicktest: JDeps (Java Dependency Analysis Tool)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,1361,2884,79,7],"tags":[1601,1592,2957,2178,1370,2956,55],"class_list":["post-8626","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java-8","category-java-9","category-programmierung","category-tools","tag-abhaengigkeiten","tag-analyse","tag-codeanalyse","tag-java","tag-java-1-8","tag-jdep","tag-junit"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/8626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8626"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/8626\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8626"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}