Thanks for the suggestion.  That led me down the right path.  It looks like the 
'system' scope is more appropriate because in this case, the classes are part 
of the rt.jar.  I used the following profile:

  <profiles>
    <profile>
      <id>Java 1.6</id>
      <activation>
        <jdk>1.6</jdk>
      </activation>
      <dependencies>
      <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
      </dependency>
      </dependencies>
    </profile>
  </profiles>

To verify this worked, I used the following command:

$ mvn dependency:build-classpath

The javax.activation jar no longer appears on the classpath, but rt.jar now 
appears (presumably because this plugin defaults to the build classpath).

If I do:

$ mvn dependency:build-classpath -DexcludeScope=system

Then I get the classpath I want.

Thanks for your help.

One question on the use of 'system path' in dependency.  Why is this necessary 
at all?  If it is part of the system, doesn't javac and/or java know where to 
find it by default?

-Doug

*Note:  I'm not sure the system path above will work quite right on a Mac.  It 
depends on how Apple decides to package things when they release 1.6.

----- Original Message ----
From: Simon Kitching <[EMAIL PROTECTED]>
To: Maven Users List <[email protected]>
Cc: Doug Donohoe <[EMAIL PROTECTED]>
Sent: Tuesday, February 5, 2008 10:57:05 AM
Subject: Re: javax.mail and javax.activation in Java 6


---- Doug Donohoe <[EMAIL PROTECTED]> schrieb:
> Hi Maven Community:
> 
> I have added this dependency in my POM:
> 
>   <dependency>
>     <groupId>javax.mail</groupId>
>     <artifactId>mail</artifactId>
>     <version>1.4.1</version>
>   </dependency>
> 
> Which is retrieved from java.net using this POM definition:
> 
>   <repositories>
>     <repository>
>       <id>java.net</id>
>       <url>http://download.java.net/maven/1</url>
>       <layout>legacy</layout>
>     </repository>
>   </repositories>
> 
> The POM for javax.mail declares a dependency on the Java activation 
> framework.  However, I am using Java 6 (1.6.0_02), which already 
> includes the activation framework.
> 
> My question:  Is there a way in maven to conditionally define a 
> dependency based on the JDK you are using?
> 
> If there is, what is the best way for me to use such a mechanism.  
> Ideally, the POM at java.net would be updated, but assuming I can't 
> figure out how to get them to update that, how do I override there
 POM?
> 

Try defining a profile called "java6" in your pom. Set its activation
 section so it only activates for java1.6. Then in the profile define
 that problem dependency with scope=provided.

I think that will do the job. Dependencies declared directly in a pom
 always override those pulled in transiently. That definitely occurs for
 version-numbers, and I *think* it works for scope too.

Regards,
Simon



Reply via email to