my set up is this. I have project A
, and a test project depending on A
:
A <- A_t
I also have other projects depending on A
(and their tests):
A <- B <- B_t
To simplify some of the testing I introduce a new library helping test stuff based on A
:
A <- Atesthelper
So A_t
(and B_t
) will depend on this test helper, like this:
A <- A_t
^ |
| v
Atesthelper
However when I create Maven projects (pom.xml) it seems the usual thing is to bundle both the project and the test of that project in the same pom.xml. And I create a new pom.xml for the Atesthelper
So now it becomes:
(A <- A_t)
^ |
| v
Atesthelper
Which is a circular dependency. Is it possible in the pom.xml to somehow specify that Atesthelper
is only a dependency of the test build target, and not the A
module in itself?
So the build order should be: A, Atesthelper, A_t. I.e. A and A_t which are specified in the same pom, should not be build at the same time.
Thanks in advance.
The cleanest way to solve this issue is to keep the projects separated. There are frameworks like Maven that encourage you to put Classes and Test Classes into one single project. Eclipse PlugIn projects for example have separate test projects. Making
A_t
a sub-project ofA
sounds like the best solution, since you can reuse whatever dependencies you want in that test project without worrying about the impact onA
.This scenario will arise more often and you might not want to bother your project design with dependencies of tests. Those tests should be independent and not influence your class design.
You didn't paste your POMs and I'm not sure if I understand you correctly, but I'll try to help you how I've got it. This is quite common case that usually should be solved like this:
Your
Atesthelper
artifact (probablyjar
packaging), that supports testing, should have all its testing-related stuff in thesrc/main
directory (so classes insrc/main/java
, resources insrc/main/resources
, etc.), notsrc/test
! All its dependencies, soA
, but also stuff like JUnit, EasyMock (all stuff that testing-support classes need) you declare withcompile
scope, which is the default one of course. Don't usetest
scope here! Finally, inA
andB
artifacts, declareAtesthelper
as dependency oftest
scope.That solution works great for me for many years. It is clean and straigt about dependencies (they're transitive in contrast to
<type>test-jar</type>
-based solution if you know what I mean). Anyway, just use it. You'll be happy ;).If I understand you right, your primary goal is to reuse test classes. A_t and Atesthelper are not Maven projects, they are tests.
Make Maven to create a jar from your src/test/java. See http://maven.apache.org/guides/mini/guide-attached-tests.html
After build of A you will get A.jar and A-tests.jar. A-tests.jar will include Atesthelper and A_t.
Set dependency of B to A-tests.jar (
<type>test-jar</type>)
.The problem that you need to solve is the dependency from Atesthelper to A, then everything else will work fine: A depends on Atesthelper, B depends on Atesthelper and both A and B will contain both sources and tests. Atesthelper will be included with scope test in both A and B. That's your target state.
How do you get there? You need to extract the items that Atesthelper is depending on into a separate projects. Typically, these are interfaces or other common functionality, which should be put into a separate project anyway - let's call it ACommon. So your target layout should look like this:
What kind of functionality is Atesthelper depending on in A? Can you move it to a separate project (ACommon)?