Adding Dynamic Dependencies
Maven dependency handling supports only static dependencies defined in project.xml. However, there are times when a plug-in will need to add a dependency at runtime.
How do I do that?
Consider your favorite plug-inâLogifier. The way you wrote it in
the previous lab has a severe limitation. Imagine that you're running
it on a Maven project that has unit tests. As you know, running the
jar
goal will automatically execute
the test:test
goal and run the unit
tests. As your logifier:logify
goal
depends on the jar
goal, it'll end
up running the unit tests on the "logified" code... Yikes! This means
that the test will fail, with this error:
java.lang.NoClassDefFoundError: org/aspectj/lang/Signature
Not only is this error message unexpected to someone not
familiar with the Logifier plug-in, but also you have a plug-in
causing problems in an unrelated plug-inâtest
. In order to fix this, you need to
rewrite the JAR plug-in so that it doesn't execute tests, or tell it
to skip the tests. Or better yet, add the aspectjrt JAR to the classpath at runtime.
This sounds like the best solution.
You can add a dependency dynamically by using the addPath
tag provided by Maven:
<goal name="logifier:init"> [...] <ant:path id="aspectjrt.classpath"> <ant:pathelement path="${plugin.getDependencyPath('aspectj:aspectjrt')}"/> </ant:path> <maven:addPath id="maven.dependency.classpath" refid="aspectjrt.classpath"/> </goal>
When your project executes, the logifier:init
goal will be ...
Get Maven: A Developer's Notebook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.