Hi,

I'm an avid Maven 1 user, but there are some things that cause me
consistent headaches.  I'm wondering if they are being addressed in
Maven 2, and if not, whether a discussion can be opened about them. 
This is a general list off the top of my head, I can provide more
description and details as requested.


1. Plugins (jar/war/etc) which insist on running tests internally
before they will do anything, and don't provide an easy way to
override this:

  - This causes problems when I want to build artifacts (jars/wars)
for integration testing, or during the build process (for example,
generating test webservice stubs by building a war, deploying in
jetty, and running wsdl2java against it).  If I make pregoals to
test:compile to ensure the artifacts are built, then I get multiple
test runs, or even worse, endless loops.  I've even gotten one project
so convoluted that it doesn't run the tests at all after a clean, but
will run them if you have not just done a clean (haven't had time to
figure that out yet).

 - I have gotten around this by having 'disabletests' and enabletests'
goals, which manually set the maven.test.skip property (preserving
whatever the previous value is).  Needless to say, this is painful and
error prone.


2. Forced and inflexible segregation of app and test classes:
- I know this has been the subject of flaming religious wars on the
maven user list, but I'm convinced that there are places where the
"just do it because that's the way it is" line doesn't cut it.  Here
are some real cases where I wish I could flexibly control where the
compiled app/test classes are created and accessed:

- First, in the case of AOP where you have circular dependencies
between app and test classes.  YES, there are legitimate reasons for
this (see note A below).  To get around this, I currently have to
compile EVERYTHING (app and test classes/aspects) to  target/classes
(${maven.build.dest}), and then have a custom goal which identifies
the test classes (which correspond to a test source file), and move
them to target/testclasses (${maven.build.dest}).  In this case, it
would be simpler to just point maven.build.dest and maven.test.dest to
the same location for a test run, then clean and recompile just the
app classes to maven.build.dest for a deployement (to avoid including
test classes in the deployable).

- Second, in the case of code coverage tools or any other plugin which
instruments/weaves/modifies app classes in a way which you do not want
to deploy (I'm working on the EMMA plugin).  For example, if you want
to instrument the classes to generate code coverage during tests, you
have to do a full recompile before deployment to avoid shipping
instrumented classes.  The clover plugin gets around this by hacking
on the  maven.build.dest value, and forcing the user to call clover:on
and clover:off goals (plugin.jelly, rev 1.28).  However, this just
seems kind of ugly, and in need of a cleaner more standardized
approach.

- I realize that these problems may be unsurmountable while still
maintaining backward compatibility with other plugins, but I'm just
wondering if any thought has been put into these types of issues.


3. Single-artifact per-project requirement

- Will maven2 still enforce the single-artifact-per-project rule?  One
place where this causes me problems is on web-service projects, where
I would like to generate a WAR, and also generate a jar or other
artifact containing web service stubs.  Multiproject is not really
applicable in this case, because the stubs are used both internally
(for integration testing of the webservice webapp itself) and as a
deployable (published in a jar for other projects which will be
clients of the webservice).


Thanks in advance.  I'm looking forward to Maven2, keep up the good work.

Chad Woolley


NOTE A: Reasons why it is legitimate to have circular dependencies
between app and test classes:
 1. There are test aspects that effect the app classes, because they
are overriding behavior to do mocking.  Yes, I know jmock/easymock are
preferred, but they don't work for all cases, sometimes AOP is better.
 2. There are non-production "stub" classes in the test tree, which
are used to test production aspects in the app tree.  This is to unit
test the aspects, and verify that they have the intended effect on a
class, without using an actual production class, which would be more
complicated and mix the concerns of testing the class and testing the
aspect.

Reply via email to