Ok, we've got different approaches here. I'll line them out to summarize:
Mine:
- use an integration testing plugin like maven-it-plugin to run test projects
placed in src/it/*/pom.xml against the current artifact, which is not installed
in any repository yet.
- The embedder is fed the current artifact and the src/it/* projects in the
reactor,
where the current artifact is marked to be skipped during the build.
Note: the IT projects don't have to specify a <version> for any <plugin>
they're testing,
since the version tag is optional. If absent, the latest version will be used,
or the version from the reactor. MNG-1677 currently prevents maven from using
a plugin
from the reactor, though normal artifacts work.
Your approach:
- bind a modified install plugin to the pre-integration-test phase to install
the artifact with a different version in the local repository
- run the invoker plugin to fork maven to build src/it/*.pom, using the local
repository,
remote repositories etc (IMHO an uncontrolled environment).
If your approach works, go for it. Here are some other comments wrt. your
problems:
- use the install:install-file mojo; you can specify the path to the artifact
in target/
and the version you want to use - no need for a forceVersion parameter.
- if you hardcode the version to install ('testing') in the pom, i see no harm
in specifying that version in src/it/*/pom.xml aswell
- perhaps the staging mojo (can't remember which plugin) is of use; it
temporarily
installs the plugin in the local repository, backing up what's there;
after the integration test, it restores the local repository.
Jason Dillon wrote:
On Mar 15, 2007, at 2:38 AM, Kenney Westerhof wrote:
Jason Dillon wrote:
How does a test repository help? I still need to configure in my
src/it/*/pom.xml the version of the plugin I'm testing.
The latest plugin will be used, which is usually what you're testing.
If the test repository does not contain other versions of the plugin,
the one you're testing will be used.
Yes, I know... *BUT* that means the current version must be configured
in the src/it/* poms... which I do not want to have to maintain/update.
And when there is no artifact for that version already in the repo then
execution of src/it will fail when executed from the integration-test
phase.
Maybe I don't understand what you mean by "test repositories".
It's basically -Dmaven.repo.local=/tmp/foo/ - an empty repository
only used for the build.
Right, that doesn't help solve any problem.
Sure it does, it solves the problem you described above: having to specify
a version in the src/it/ poms. If there's only 1 version available in the
local repository (/tmp/foo), that one will be used. so you don't have to
specify the version.
I just want my src/it/*/pom.xml to *always* use the right version of
the plugin (ie. that which was just compiled). I don't want to have
to go updating poms each time I make a new release to use the new
version.
This has nothing to do with versions, actually. See below.
See comment above... it has everything to do with versions. :-P
See comment above. ;)
Maven is very careful
not to make artifacts available that have failing tests.
If test fails, package won't run.
If integration-test fails (after package), install won't run.
Right... and I like that *feature* but to run integration tests my
plugin I need it to be in the repository so it will resolve...
With your approach, requiring the use of the local repo, yes. With
mine, no. ;)
The problem here is MNG-2677 (originally MNG-870): maven can't resolve
plugins
from the reactor.
Um... no... I agree MNG-2677 is a problem... and I'm still waiting for
that to get fixed for the Geronimo build... but that is *not* the
problem here. src/it/* tests are *not* run from the reactor, nor do I
want them to be run from the reactor.
There are 2 reactors: the main build reactor, and the reactor created
by the maven-it-plugin which contains the artifact to test and the test
projects.
So then it _is_ a problem if you take that approach.
I wrote the maven-it-plugin a while ago (at the time of writing MNG-870),
which will run an embedded maven on src/it/*/pom.xml (which was later
turned
into the embedder). This embedded maven would recognize the just built
plugin
from the reactor, and not use the version from the local repository.
I'm using the maven-invoker-plugin and aside from this version issue I'm
really happy with it.
Ok. You could also use the verifier (shared/maven-verifier). That one also
forks maven (or runs it embedded if you choose). We use it in the
core-integration-tests.
>>> If you can explain a better way to achieve the desired result I'm all
ears... but so far this is the only solution I can think of which
will work 100% of the time.
The proper way would be to explicitly run the tests against
target/${artifact},
and not let it poms resolve it from the local or remote repositories.
Um... no... these are *integration tests* they are meant to test/verify
that integration with Maven works. And to do that, the artifacts being
tested need to get picked up/configured in the normal way.
They are, just not from the local repo but from a predefined path. I think
we've established that maven can run plugins from local and remote repositories
so you don't have to test that ;)
So, versions for plugins are not needed in src/it/*/pom.xml. And even
if you do
specify one, you can't be certain that the version matches the
artifact being
built, and even worse, you can't be certain the artifact just built is
being used.
Um... I don't get what you mean here at all... by using forceVersion,
running that in pre-integration-test, I can be 100% certain that the
code being tested *is* the code that was just built.
It's one way to do it, yes, overwriting the existing plugin in the local
repository.
But if the integration test fails, and some project uses your plugin without a
version
specified, it could use the faulty 'testing' plugin in the local repository.
That's
something maven tries to avoid - placing artifacts in the local repo that
haven't
passed the tests.
* * *
I'm happy to keep talking about this... and maybe I can convince
you/someone that this is the simplest solution... though I suppose at
the end of the day if the Maven dev team isn't interested in applying
the patch I made, I will be forced to make a new plugin to do the same
thing... which I'd like to avoid.
If you can convince us, we'll apply the patch, but there are some drawbacks.
There are other discussions going on how to get all the different integration
test methods sorted out in just one approach, where this one is a solution
to a problem we're having with one of them, which was already solved in another
mojo.
Anyway I think it's a good thing to get the discussion going again so we can
sort
this out. I really think maven should provide an easy means of integration
testing
plugins and other artifacts, preferrably without polluting the local repository
;)
-- Kenney
--jason
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]