Maven: Unpack-Dependencies ... and then forget about them
I have a library A, which depends on the libraries B and C. I unpack the libraries classes of B and C into the jar for library A using the maven-dependency-plugin (see below).
Now, when a library D uses library A, library D can access all the classes of A, B and C. However, I want D only to depend on A but not on the transitive dependencies B and C.
I know this can be achieved by manually excluding B and C for the dependency A-D but I would like to somehow declare in A that B and C are not to be made known to modules using A.
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
开发者_JAVA技巧 <goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
I think you can mark the dependency with the scope "provided" so the dependent project will assume that the jar's are already "provided". Normally they are provided by the container, in your case you "provided" them in dependency A.
In any case modules dependent on A will ignore the dependencies B and C.
First option, use dependency:unpack
instead of dependency:unpack-dependencies
and thus list B and C in the plugin configuration instead of declaring them as dependencies (so they will be unknown to D).
Second option, declare B and C as dependencies of A with a provided
scope as suggested by Peter (see Transitive Dependencies) and you won't "see" them in D.
I did something similar this week using the maven-shade-plugin to create an uber jar.
However when I added the uber jar as a dependency to another project the underlying jars were transitively added.
To fix it I had to mark the dependencies of the uber-jar as <optional>true</optional> in its pom, and reinstall the uber-jar.
See http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
精彩评论