|
What can you do to avoid that when you use one Maven dependency, to also inherit some other undesirable older dependency (which is to say from an older transitive dependency). The fix to this is to add an exclusion to the dependency in question. For example, if we start with a dependency upon version 1.2 of the jxpath library: <dependency>
<groupId>common-jxpath</groupId>
<artifactId>common-jxpath</artifactId>
<version>1.2</version>
<scope>compile</scope> <!-- default scope for sake of example-->
</dependency>
This dependency to jxpath 1.2 will bring in an old version of log4j 3.8. In order to ensure that I am using the latest
versions of log4j (4.4),
I need to put in an exclusion for these transitive dependencies of common-jxpath, which I do as follows:
<dependency>
<groupId>common-jxpath</groupId>
<artifactId>common-jxpath</artifactId>
<version>1.2</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
<!-- I can put many of these here --> </exclusions>
</dependency>
Having excluded them, they will be any longer in the build.
Now, there is still too many thing that can occur in the background
- Another 3rd party artifact may include log4j by using a transitive dependencies, and then you will have to rely/trust transitive
dependency mediation
- You can explicitly include the versions that you want in all pom.xml or better in your parent pom.xml
Transitive dependency mediation
Dependency mediation - this determines what version of a dependency will be used when multiple versions of an artifact are
encountered. Currently, Maven 2.0 only supports using the "nearest definition" which means that it will use the version of
the closest dependency to your project in the tree of dependencies. You can always guarantee a version by declaring it
explicitly in your project's POM. Note that if two dependency versions are at the same depth in the dependency tree, until
Maven 2.0.4 it was not defined which one would win, but since Maven 2.0.5 it's the order in the declaration that counts: the
first declaration wins.
"nearest definition" means that the version used will be the closest one to your project in the tree of dependencies, eg. if
dependencies for A, B, and C are defined as A -> B -> C -> D 2.0 and A -> E -> D 1.0, then D 1.0 will be used when building A
because the path from A to D through E is shorter. You could explicitly add a dependency to D 2.0 in A to force the use of D 2.0
find out what the transitive dependencies are?
You can't control what you do not know!
One that can be use during build stage or explicitly use on command line, is the maven plugin maven-dependency-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</build>
and then use the goal dependency:tree, so a typical build strategy could look like
mvn clean install dependency:tree
or
mvn clean install dependency:list (easier to tokenize in excel sheet)
So it look like
| With no exclusions |
|
[INFO] [dependency:tree]
[INFO] com.test:test:jar:0.0.1-SNAPSHOT
[INFO] \- commons-jxpath:commons-jxpath:jar:1.2:compile
[INFO] +- xerces:xerces:jar:1.2.3:compile
[INFO] +- javax.servlet:servlet-api:jar:2.2:compile
[INFO] +- junit:junit:jar:3.8:compile
[INFO] +- ant:ant-optional:jar:1.5.1:compile
[INFO] +- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- jdom:jdom:jar:b9:compile
[INFO] +- commons-beanutils:commons-beanutils:jar:1.4:compile
[INFO] +- commons-logging:commons-logging:jar:1.0:compile
[INFO] \- commons-collections:commons-collections:jar:2.0:compile
[INFO] [dependency:list]
[INFO]
[INFO] The following files have been resolved:
[INFO] ant:ant-optional:jar:1.5.1:compile
[INFO] commons-beanutils:commons-beanutils:jar:1.4:compile
[INFO] commons-collections:commons-collections:jar:2.0:compile
[INFO] commons-jxpath:commons-jxpath:jar:1.2:compile
[INFO] commons-logging:commons-logging:jar:1.0:compile
[INFO] javax.servlet:servlet-api:jar:2.2:compile
[INFO] jdom:jdom:jar:b9:compile
[INFO] junit:junit:jar:3.8:compile
[INFO] xerces:xerces:jar:1.2.3:compile
[INFO] xml-apis:xml-apis:jar:1.0.b2:compile
|
With exclusions
|
[dependency:tree]
[INFO] com.test:test:jar:0.0.1-SNAPSHOT
[INFO] \- commons-jxpath:commons-jxpath:jar:1.2:compile
[INFO] +- xerces:xerces:jar:1.2.3:compile
[INFO] +- javax.servlet:servlet-api:jar:2.2:compile
[INFO] +- ant:ant-optional:jar:1.5.1:compile
[INFO] +- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- jdom:jdom:jar:b9:compile
[INFO] +- commons-beanutils:commons-beanutils:jar:1.4:compile
[INFO] +- commons-logging:commons-logging:jar:1.0:compile
[INFO] \- commons-collections:commons-collections:jar:2.0:compile
[INFO] [dependency:list]
[INFO]
[INFO] The following files have been resolved:
[INFO] ant:ant-optional:jar:1.5.1:compile
[INFO] commons-beanutils:commons-beanutils:jar:1.4:compile
[INFO] commons-collections:commons-collections:jar:2.0:compile
[INFO] commons-jxpath:commons-jxpath:jar:1.2:compile
[INFO] commons-logging:commons-logging:jar:1.0:compile
[INFO] javax.servlet:servlet-api:jar:2.2:compile
[INFO] jdom:jdom:jar:b9:compile
[INFO] xerces:xerces:jar:1.2.3:compile
[INFO] xml-apis:xml-apis:jar:1.0.b2:compile
|
see Maven Dependency Plugin
Related Posts
-
I forgot to blog about this presentation at JAZOON 2008, but I did never forget the added value of this plugin. It is not currently in Apache Maven core but will for sure find its way as an official plugin one day, since it solve elegantly a common problem: technology management Maven does not know the concept of an artifact life cycle. Su 7 days ago
-
It is not unusual in a project to have a huge number of third party artifacts and Plug-in. Apache Maven help you keep track of them, along with their transitive dependencies.
But how do you know when a new version of an artifact is available? This is where the Maven Versions plug-in come hand in.
The Versions Plug-in is used when you wa 7 days ago
-
In which order are Apache Maven profiles executed? are Apache Maven profiles ordered? how can you insured that Apache Maven profiles are activated in the right order? You normally don’t end up with these questions, issues may only appear if Some profiles are dependent each other, Some profiles can not run in any order, The use case 28 days ago
-
I won’t explain you how to write any JBehave tests as the online documentation is more than complete. I prefer to show you how to make them run in eclipse, and in Apache Maven as the example were not easy to run (scenario are wrongly in src/main/java). JBehave is a framework for Behaviour-Driven Development Behaviour-driven dev 42 days ago
-
I found this time a new way to deploy Maven artefacts using the Oracle Weblogic Ant API!
If you remember my previous post, there is many ways to deploy your war/ear to Oracle Weblogic
Using Oracle Weblogic development mode, a mode in which a simple copy of your files in a specific autodeploy directory trigger the update/install o 62 days ago
-
I was getting mad because jetty was refusing to redeploy my static files (xhtml, css) in Eclipse until I find the reason The Jetty Web Server provides a HTTP server and Servlet container capable of serving static and dynamic contend either from a standalone or embedded instantiations. Jetty buffers static content for webapps such as html files, 96 days ago
-
I was fighting today against the maven-release-plugin of maven, solving complicated errors in a row. As I am convince I made all possible errors, I think it is worse to compile my findings here to help others :-)
Maven Release Plugin
This plugin is used to release a project with Maven, saving a lot of repetitive, manual work. 159 days ago
-
Subversion (SVN) is an open source version control system. It allows users to keep track of changes made over time to any type of electronic data. Typical uses are versioning source code, web pages or design documents. Installing the latest Subversion (svn) version 1.6.6 is a bit more difficult than just running apt-get install subversion, as t 159 days ago
-
In this small post I will show you how to deploy automatically some artifacts of your build into Weblogic 10.3 by using the weblogic-maven-plugin
This plugin will support various tasks within the Weblogic 8.1 and 9.x environment. Such tasks as deploy, undeploy,clientgen,servicegen, and appc are supported as well as many others. The 159 days ago
-
If your Artifactory installation grows of many Gb each day - althought you do not deploy so many new artifacts. I suggest you to look under the repositories settings.
All your local repositories are configured as default with Snapshot Version Behavior = Non-Unique. As stated in the manual, all deployed SNAPSHOTS with be keep with unique time-sta 168 days ago
relatedArticles
|