Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Abandoned
-
5.9.0
-
None
-
None
-
Patch Available
Description
I encountered an issue when adding a dependency on activemq-all into my project; it caused a collision with our existing dependency on slf4j-log4j12
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/root/.m2/repository/org/slf4j/slf4j-log4j12/1.6.2/slf4j-log4j12-1.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/root/.m2/repository/org/apache/activemq/activemq-all/5.9.0/activemq-all-5.9.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
The main issue is that because the activemq-all jar is shaded there is no way for us to use maven dependency exclusions command to not take the activemq-all contributed slf4j-log4j12 artifact.
There is a straight forward fix to this issue.
Switch from using the maven-shade-plugin to using a pom dependency which aggregates the activemq dependencies in a maven controllable way.
By making the packaging of the activemq-all artifact pom it means that when it is included in a project only the transitive dependencies that it declares are included, the pom artifact itself is not.
I've tested that this works in our project that depends on activemq-all 5.9.0 and also have a patch prepared against the current 5.10-SNAPSHOT trunk.
The only difference to the consumer of the activemq-all artifact is that they have to specify the <type> as pom.
For example:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.9.0</version> <type>pom</type> </dependency>
The Apache Wicket project uses the same approach, see here