DependencyManagement should allow <replaceWith> to manage use of re-named, 
woven, instrumented or compatible artifacts
----------------------------------------------------------------------------------------------------------------------

                 Key: MNG-4391
                 URL: http://jira.codehaus.org/browse/MNG-4391
             Project: Maven 2
          Issue Type: Improvement
          Components: Dependencies
    Affects Versions: 2.2.1
            Reporter: Neale


[if only this was a later version of JIRA I'd have not lost all of what I just 
typed, as I could use Mylyn instead of the web UI.  here goes again...]

The challenge of using a different artifact instead of the one that is 
specified in a POM that you are consuming is not an easy one.

Examples where this hits uses is:
- the artifact name and packaging changes that Spring made at 2.5.6A (which was 
a big improvement)
- wanting to use SLF4J instead of Apache commons logging (i.e. use something 
that provides the same API, but is an entirely different project)
- wanting to use your own derivation of a public artifact
- wanting to use a woven/instrumented version of a public artifact

The current approach to replacing, say org.springframework : spring-beans with 
org.springframework : org.springframework.beans is to do ('scuse the shorthand):
{code:xml}
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.sun.jersey.contribs</groupId>
      <artifactId>jersey-spring</artifactId>
      <exclusions> 
           org.springframework : spring-beans
      </exclusions>
    </dependency>
    ... repeat for every artifact that uses spring-beans, and then add more if 
adding another artifact
  </dependencies>
</dependencyManagement>
{code}

to exclude it, and then globally include the replacement using:
{code:xml}
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactid>org.springframework.beans</groupId>
    <version>${spring.version}</version>
  </dependency>
</dependencies>
{code}

This is error prone, and could be made far easier by an extension to 
dependencies, which would remove the need to know what artifacts (jersey-spring 
in the above example) use the artifact that you are replacing.  Here's how it 
would look:

{code:xml}
<dependencyManagement>
  <!-- this declares the version we want to use if this artifact is in use -->
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactid>org.springframework.beans</groupId>
      <version>${spring.version}</version>
    </dependency>

    <!-- This deals with artifact name change -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactid>spring-beans</groupId>
      <replaceWith>  <!-- list of dependency elements -->
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactid>org.springframework.beans</groupId>
          </dependency>
          <!-- more dependency elements could be added here if an artifact has 
been split -->
      </replaceWith>
    </dependency>
</dependencies>
{code}

NOTE:
- Nothing is specified in <dependencies> so no artifacts are globally added 
where they may not be needed.  This means we can develop a project wide parent 
pom.xml.
- Artifacts can have been split and merged
- Derived artifacts, such as instrumented ones can easily be substituted, and 
could be selectively substituted using profiles.



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to