Developing with Eclipse and Maven
7.2. Analyzing Project Dependencies in m2eclipse
The latest release of m2eclipse contains a POM
editor which provides some dependency analysis tools. These tools promise
to change the way people maintain and monitor a project's transitive
dependencies. One of the main attractions to Maven is the fact that it
manages a project's dependencies. If you are writing an application which
depends on the Spring Framework's Hibernate3 integration, all you need to
do is depend on the spring-hibernate3
artifact from the
Central Maven Repository. Maven then reads this artifact's
POM and adds all of the necessary transitive
dependencies. While this is a great feature that attracts people to using
Maven in the first place, it can often become confusing with a project
starts to depend on tens of dependencies, each with tens of transitive
dependencies.
Problems start to happen when you depend on a project with a poorly
crafted POM which fails to flag dependencies as
optional, or when you start encountering conflicts between transitive
dependencies. If one of your requirements is to exclude a dependency like
commons-logging
or the servlet-api
,
or if you need to find out why a certain dependency is showing up under a
specific scope you will frequently need to invoke the
dependency:tree
and
dependency:resolve
goals from the command-line to track
down the offending transitive dependencies.
This is where the POM editor in m2eclipse comes in handy. If you open a project with many dependencies, you can open the Dependency Tree tab and see a two-column display of dependencies as shown in Figure 7.4, “Dependency Tree Tab of the POM Editor”. The left-side of the panel displays a tree of dependencies. The first level of the tree consists of direct dependencies from your project, and each subsequent level lists the dependencies of each dependency. The left-hand side is a great way to figure out how a specific dependency made its way into your project's resolved dependencies. The right-hand side of this panel displays the resolved dependencies. This is the list of effective dependencies after all conflicts and scopes have been applied, and it is the effective list of dependencies that your project will use for compilation, testing, and packaging.
The feature which makes the Dependency Tree tab so valuable is that
it can be used as an investigative tool to figure out how a specific
dependency made it into the list of resolved dependencies. Searching and
filtering functionality available in the editor makes it really easy to
search and browse trough the project dependencies. You can use “Search”
entry field from the editor tool-bar and “Sort” and “Filter” actions from
“Dependency Hierarchy” and “Resolved Dependencies” sections to navigate
trough dependencies. Figure 7.5, “Locating Dependencies in the Dependency Tree” shows what happens
when you click on commons-logging in the "Resolved Dependencies" list.
When filtering is enabled in “Dependencies Hierarchy” section, clicking on
a resolved dependency filters the hierarchy on the left-hand side of the
panel to show all of the node which contributed to the resolved
dependency. If you are trying to get rid of a resolved dependency, you can
use this tool to find out what dependencies (and what transitive
dependencies) are contributing the artifact to your resolved dependencies.
In other words, if you are trying to get rid of something like
commons-logging
from your dependency set, the
Dependency Tree tab is the tool you will likely want to use.
m2eclipse also provides you with the ability to view your project's
dependencies as a graph. Figure 7.6, “Viewing the Dependencies of a Project as a Graph” shows the dependencies of
idiom-core
. The top-most box is the
idiom-core
project and the other dependencies are shown
below it. Direct dependencies are linked from the top box and the
transitive dependencies are linked from those. You can select a specific
node in the graph to highlight the linked dependencies, or you can use the
Search field at the top of the page to find matching nodes.
Note that “open folder” icon on each graph node indicates that the corresponding artifact is present in the Eclipse workspace and “jar” icon indicates that the node's artifact is referenced from the Maven repository.
The graph presentation can be changed by right clicking in the editor. You can choose to show artifact ids, group ids, versions, scopes, or if you want to wrap node text or show icons. Figure 7.7, “Radial Layout of Dependency Graph” shows the same graph from Figure 7.6, “Viewing the Dependencies of a Project as a Graph” with a radial layout.