Hello Matthieu,

thanks for good and clear explanation.

One thing left:
>> The maven-scope test defines this behavior.
> Of course. If you have a look at a "product" project like 
> server/container/cassandra-guice/ , you should not get any test artifact 
> when creating the deployment artifact.

That is exactly the question I stumpled across:
For me, james-server is a product, the one we need.
If you have a look at the "james-server" project, in that pom.xml.
There is the dependency to elasticsearch test-jar.
                <artifactId>apache-james-mailbox-elasticsearch</artifactId>
                <type>test-jar</type>
But as you stated, this may have a goal, like async assertions.

I am (trying to) run maven in eclipse, so I do not have a command line.

As I run maven with 
        Goals:  "clean compile package install"
        -D:     skipTests

I get:
[ERROR] Failed to execute goal on project james-server-mailets: Could not 
resolve dependencies for project 
org.apache.james:james-server-mailets:bundle:3.0.0-beta5-SNAPSHOT: Failure to 
find org.apache.james.protocols:protocols-managesieve:jar:tests:1.6.4-SNAPSHOT 
in http://repository.apache.org/snapshots was cached in the local repository, 
resolution will not be reattempted until the update interval of 
apache.snapshots has elapsed or updates are forced -> [Help 1]

Removing the test-jar from pom.xml fixes that problem.

Greetings
Bernd

-----Ursprüngliche Nachricht-----
Von: Matthieu Baechler [mailto:mbaech...@linagora.com] 
Gesendet: Montag, 21. März 2016 22:24
An: server-dev@james.apache.org
Betreff: Re: AW: james-server pom.xml missing scope test [unsigned]



On 21/03/2016 16:23, Bernd Waibel wrote:
> Hi Matthieu,
>
> thanks for the nice response. I would like to follow the discussion.
>
> At first I just had a look at the pom.xml of the server project, searching to 
> solve my maven problems.
> Only cassandra and elasticsearch do define test-jar without scope.
> All other test-jars have the <scope>test</scope>.
> So I thought: all projects should use this pattern.
> I think that the maven <scope>test</scope> defines the parts of an project, 
> which should be used inside a phase "test", for testing an application. But 
> not inside a phase "publish" or "compile" (except compile-test).

<scope>test</scope> import the dependency _to compile and run tests_, 
that is, the code under src/test.

> At second there is another thing I do not understand:
> In the pom.xml of the james-server and in
>      <artifactId>apache-james-mailbox-elasticsearch</artifactId>
> there is a dependency
>                  <dependency>
>                      <groupId>junit</groupId>
>                      <artifactId>junit</artifactId>
>                      <scope>test</scope>
>                  </dependency>
> Here you used the test scope.
> But this "junit" dependency is needed to compile the test-jar of 
> elasticsearch inside server/pom.xml.
> Defining the test-jar without any scope leads to the fact, that compiling the 
> server will fail inside the compile phase, as missing the junit (and others), 
> cause junit is not defined inside the compile phase.
> Is this correct? Remember: I am not a maven expert. ;-)

test-jar contains compiled code from src/test, it uses every artifacts 
without any scope and also artifacts with test scope.

All these dependencies are attached to the test-jar artifact and will be 
imported recursively by any project depending on it, whatever the scope 
it is imported in.

Here is an example.
apache-james-mailbox-elasticsearch project generates two artifacts :

1/ apache-james-mailbox-elasticsearch
2/ apache-james-mailbox-elasticsearch test-jar

1/ doesn't use junit to compile. it doesn't define junit as a dependency.

2/ need junit to compile (and will get it from its dependencies), it 
declares junit as a dependency and when apache-james-mpt-smtp-cassandra 
project import it, it gets automatically junit as a dependency.

> Shouldn't every "test" dependencies use the same <scope>?

Not always. Sometime you use awaitility for production code, sometime 
for async assertions for example.

> At third, I had a look on this because we need to deploy it. That is the 
> "architecture" side of this question. When deploying an application, I like 
> it small. So we try to get rid of "debug" and "test" code, if we push our 
> product to our customers. They will never need to test or debug "our" 
> application.
> So I like it to have a "test" deployment, and a "runtime" deployment.
> The maven-scope test defines this behavior.

Of course. If you have a look at a "product" project like 
server/container/cassandra-guice/ , you should not get any test artifact 
when creating the deployment artifact.

>
> At last, the problem which caused the question:
> I just could not get the "james-server" to compile. Not inside eclipse.
> One reason is, that some test-classes won't compile.
> This is currently a "managesieve" error, exactly, not a elasticsearch 
> problem, as I did find out.

You should just refresh your SNAPSHOT dependencies (under eclipse, you 
can find this option under Maven -> Update Projet)

> But test-classes should not be critical for running James (IMO).
> But currently it is, because James won't run without test-classes.

It should not be true.

> So the test-classes may be a show-stopper.
>
> As I understand, maven will currently use the <test-jar> dependency, if 
> running through the package phase of james-server, cause it does not have any 
> scope.
> The -Dskiptests will not work, cause the artifact is not of scope test.
> Furthermore the test-jar is not available on the apache repo 
> https://repository.apache.org/content/groups/snapshots/org/apache/james/
> It should be.

I don't think so.

> But that is another problem.
>
> Currently I just comment out all test-jar directives in server/pom.xml, to 
> get maven to package my james server. This is ok for me. But I just like to 
> understand.
>
>
> Just my part of thoughts, and not worth a jira ticket.

It's not "maven" that want to have tests to compile, it's you that ask 
for. If you want to compile only production code, you can do something 
like :

mvn -am -pl server/container/cassandra-guice -DskipTests

When you simply call maven without any project (here, I use -am -pl to 
list projects I want to compile), every single project compiles, even 
test projects, so you have to filter what you want.

I hope my answer helps.

Cheers,

-- 
Matthieu Baechler

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to