Steve Steve - 7 months ago 19
Java Question

why is "test-jar" dependency required for "mvn compile"

I'm having trouble using

dependencies in a multi-module project. For example, when I declare that the
module depends on the
like this (the full code is here):


I get the following error if I run
mvn compile
using maven 2:

[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT

If I use maven 3 I get the error:

[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.654s
[INFO] Finished at: Mon Jan 24 21:19:17 CET 2011
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve
dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could
not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT

In the latter case, I'm particularly confused because I would have thought it should be looking for an artifact of type
not of type

With maven 2 or maven 3, I can get it to compile by running
mvn compile package -DskipTests
. With maven 3, I can also get it to compile by running
mvn compile test-compile

But why is either maven 2 or maven 3 looking for a
dependency during the
phase? Shouldn't it wait until the
phase to look for such dependencies?

Update: The answer was that the maven-exec-plugin, used during my compile phase, requires dependency resolution of artifacts in scope:test. I've created a feature request to remove the scope:test dependency.


This looks like a definite bug to me.

I have the same problem and tested Maven 3.0.1 and 3.0.2. Validate doesn't fail, only the compile step fails. With Maven 3 mvn compile breaks but mvn test-compile works.

It appears that the compile phase is looking for test-jar artifacts in the reactor and then repo, but it shouldn't since the dependency is in test scope. Test scope artifacts should be resolved during test-compile, not compile.

As a result, I thought this could be worked around by mapping the maven-compiler-plugin's testCompile goal to the compile phase, instead of the default test-compile phase.

I added this to my pom, right next to the part that adds the test-jar creation in the upstream pom:

  <!-- there is a bug in maven causing it to resolve test-jar types
       at compile time rather than test-compile. Move the compilation 
       of the test classes earlier in the build cycle -->

But that won't work either because the five phases between compile and test-compile haven't run and set up things like the test classpath.

I guess the real workaround until this bug is fixed is to use test-compile in place of compile.