How to generate a graph of the dependency between all modules of a Maven project?

JavaMaven 2

Java Problem Overview


How to generate a graph of the dependency between all modules of a Maven project (excluding third party libraries like JUnit, SLF4J, etc.)? I couldn't find a way to include all modules into one graph using m2eclipse. Thanks.

Java Solutions


Solution 1 - Java

If the Dependency Graph feature of m2eclipse doesn't cover your needs, maybe have a look at the Maven Graph Plugin and in particular its graph:reactor goal.

UPDATE: the Dependency Graph feature was removed in m2eclipse 1.0. For more info see: https://stackoverflow.com/questions/6475927/maven-pom-editor-dependency-graph-missing

Solution 2 - Java

Another option is the com.github.janssk1 maven dependency graph plugin. This plugin outputs the dependencies to a graphml file which can be opened and edited in an editor like yEd.

To generate the graphml file:

mvn com.github.janssk1:maven-dependencygraph-plugin:1.0:graph

This plugin does not currently provide any mechanism to exclude 3rd party dependencies, AFAICT, but they can be deleted manually from the graph using yEd or via an XSLT stylesheet that post-processes the graphml files. Here is a simple stylesheet that will delete the third party dependencies (any dependency not starting with the package provided by the "internal" parameter):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:gml="http://graphml.graphdrawing.org/xmlns/graphml"
    version="2.0">

  <xsl:output method="xml"/>
  <xsl:param name="internal"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="gml:node[not(starts-with(@id, $internal))]"/>

  <xsl:template match="gml:edge[not(starts-with(@source, $internal)) or not(starts-with(@target, $internal))]"/>

</xsl:stylesheet>

And execute it via an XSLT 2.0 compatible processor such as Saxon:

saxon input.graphml exclude-third-party-deps.xsl internal="my.package" > input-internal.graphml

Solution 3 - Java

there exists exactly what you need, it is called Pom Explorer.

You can find the website here : github.com/ltearno/pom-explorer

It is a tool to work on a graph of maven projects. As a teaser i can say that on my machine it analyzes 4000 pom.xml files in 4 seconds. Then many functionnalities are provided above the analysed pom graph :

  • dependency analysis (who depends on GAV, which gavs this GAV depends on, with transitivity),
  • resolution (pom explorer knows where are defined properties, it manages dependencies and bom imports),
  • manipulation (you can use it to transform you pom graph, let's say if you want many projects to use a new version of a dependency),
  • build (pom explorer analyses your pom graph and knows in which order they should be built, then it builds everything ! it can even watch your projects directories for change),
  • exporting (today there is CSV and a GRAPHML exports),
  • visualization (pom explorer can show you an interactive 3D customizable visualization of your projects graph).

It is in active development right now so don't hesitate to try it, report bugs and ask for useful features ! The documentation is also not complete yet, so again don't hesitate to ask !

Thanks

Solution 4 - Java

Checkout this project too: https://github.com/roclas/pomParser

It creates a pretty cool "graph" that can be navigated in both ways (forwards and backwards). The idea is very simple, and you can download and change the code very easily.

Solution 5 - Java

Installed Maven Graph Plugin: http://mvnplugins.fusesource.org/maven/1.10/maven-graph-plugin/index.html, configured it this way to hide third party dependencies. Worked out fine.

 <profile>
  <id>graph</id>
  <pluginRepositories>
    <pluginRepository>
      <id>mvnplugins.fusesource.org</id>
      <url>http://mvnplugins.fusesource.org/repo/release</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <plugins>
      <plugin>
        <groupId>org.fusesource.mvnplugins</groupId>
        <artifactId>maven-graph-plugin</artifactId>
        <version>1.10</version>
        
		<configuration>
		  <hideExternal>true</hideExternal>
		</configuration>
        
      </plugin>
    </plugins>
  </build>
</profile>

Solution 6 - Java

Just found this one, works great, lots of output formats and ways of filtering: https://github.com/ferstl/depgraph-maven-plugin

Using that, the answer to the question becomes a one-liner (found in this helpful blog entry:

mvn com.github.ferstl:depgraph-maven-plugin:3.0.1:aggregate -DcreateImage=true -DreduceEdges=false -Dscope=compile "-Dincludes=your.group.id*:*"

Solution 7 - Java

Haven't you opened the pom via Eclipse and taken a look onto the tab-folders of the pom.xml where one entry is name "Dependency Graph" ? Ah sorry...oversight something...You can create a dependency tree via mvn dependency:tree on command line, but this produces no graphical view. An other better solution might be the Maven Overview Plugin

Solution 8 - Java

This might be good enough for some people:

Command: mvn dependency:tree -Dincludes=com.yourpackage:*

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser168237View Question on Stackoverflow
Solution 1 - JavaPascal ThiventView Answer on Stackoverflow
Solution 2 - JavaRamanView Answer on Stackoverflow
Solution 3 - JavaArnaud TournierView Answer on Stackoverflow
Solution 4 - JavaCarlosView Answer on Stackoverflow
Solution 5 - JavaYilingView Answer on Stackoverflow
Solution 6 - JavajfrantziusView Answer on Stackoverflow
Solution 7 - JavakhmarbaiseView Answer on Stackoverflow
Solution 8 - JavabrostbeefView Answer on Stackoverflow