Uploaded image for project: 'Ivy'
  1. Ivy
  2. IVY-1154

More than one rule matched while retrieving parent POM

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 2.1.0
    • None
    • None
    • Windows 7, Sun JDK 1.6.0_16, Ant 1.7.1

    Description

      In trying to build an Ivy repository with a sensible org/module hierarchy, I seem to have stumbled over a bug in the namespace translation code. In the following Ivy configuration, I'm trying to map all apache commons projects into the "org.apache.commons" organization, locally, even though many of them have the module name as the org name in the maven2 repo. The second and third rules in this namespace ought to be equivalent in their effect, but they are not...if I use the rule with the regex, it appears to match the "commons-parent", which it shouldn't, because commons-parent is matched by the first rule in the namespace ("chainrules" is false).

      If you comment out rule #3 and uncomment rule #2, it works just fine, because rule #2 cannot match "commons-parent".

      ivysettings.xml
      <ivysettings>
      
        <property name="ibiblio-maven2-root" value="http://repo1.maven.org/maven2/" override="false" />
      
        <!--
          The ibiblio Maven2 repository has some funky historical ways of organizing projects. Specifically, Apache
          projects are not filed under "org.apache", as you'd expect them to be...instead, the org name is the name
          of the project (e.g., "commons-lang"). This namespace definition converts all known Apache projects to the
          more normal organization, by mapping them to an org name of "org.apache".
        -->
        <namespaces>
          <namespace name="ibiblio-maven2">
      
            <!-- After a certain point in time, it appears that new Apache projects were properly placed under
                 org/apache/... commons-parent is one of these. This rule should match any request for
                 org.apache.commons#commons-parent;*. It is first in the list because we want it to match commons-parent,
                 rather than the commons-.+ regex of the next rule. -->
            <rule>
              <fromsystem>
                <src org="org\.apache\.commons" module="commons-parent"/>
                <dest org="org.apache.commons" module="$m0"/>
              </fromsystem>
              <tosystem>
                <src org="org\.apache\.commons" module="commons-parent"/>
                <dest org="org.apache.commons" module="$m0"/>
              </tosystem>
            </rule>
      
            <!-- ALTERNATIVE #1: THIS WORKS
                 commons-math, on the other hand, lives in the "old" place, with the module name instead of the org name
                 as the directory. If I write a rule that specifically translates org.apache.commons#commons-math;* into
                 "commons-math"/"commons-math", everything works fine, and we can resolve both commons-math and also
                 commons-parent. -->
            <!--rule>
              <fromsystem>
                <src org="org\.apache\.commons" module="commons-math"/>
                <src org="org\.apache\.commons" module="commons-logging"/>
                <src org="org\.apache\.commons" module="commons-discovery"/>
                <dest org="$m0" module="$m0"/>
              </fromsystem>
              <tosystem>
                <src org="commons-math" module="commons-math"/>
                <src org="commons-logging" module="commons-logging"/>
                <src org="commons-discovery" module="commons-discovery"/>
                <dest org="org.apache.commons" module="$m0"/>
              </tosystem>
            </rule-->
      
            <!-- ALTERNATIVE #2: WHY ISN'T THIS EQUIVALENT TO #1?
                 Things go to crap, on the other hand, if I try to use a regex to match any commons- prefixed project.
                 In theory, since I put an explicit rule to match commons-parent earlier in the rule sequence, commons-parent
                 should never get to here. In practice, it seems to, and the lookup for commons-parent fails, because it's
                 looking for http://repo.whatever.org/commons-parent/commons-parent/7/commons-parent-7.pom, which does not
                 exist. -->
            <rule>
              <fromsystem>
                <src org="org\.apache\.commons" module="commons-.+"/>
                <dest org="$m0" module="$m0"/>
              </fromsystem>
              <tosystem>
                <src org="commons-.+" module="commons-.+"/>
                <dest org="org.apache.commons" module="$m0"/>
              </tosystem>
            </rule>
      
          </namespace>
        </namespaces>
      
        <!-- We want the "all versions" conflict manager, so that newer versions don't evict old ones from the repo -->
        <settings defaultConflictManager="all" />
      
        <resolvers>
          <filesystem name="ivy-repository">
            <ivy pattern="${ivy.repo.dir}/[organisation]/[module]/ivys/ivy-[revision].xml"/>
            <artifact pattern="${ivy.repo.dir}/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
          </filesystem>
          <ibiblio name="ibiblio-maven2-repository" 
                   root="${ibiblio-maven2-root}" 
                   m2compatible="true"
                   namespace="ibiblio-maven2"/>
        </resolvers>
      
      </ivysettings>
      

      Here is the corresponding build.xml for controlling this from Ant. If you want to run this, adjust the value of the ivy.repo.dir property for your system, and then run "ant install".

      build.xml
      <project name="ivy-repository" xmlns:ivy="antlib:org.apache.ivy.ant">
      
        <property name="from.resolver" value="ibiblio-maven2-repository"/>
        <property name="to.resolver" value="ivy-repository"/>
        <property name="ivy.repo.dir" value="C:/Users/jediry/repo"/>
        
        <target name="install">
          <delete dir="${ivy.repo.dir}"/>
          <mkdir dir="${ivy.repo.dir}"/>
          <ivy:settings id="ivy.instance" file="ivysettings.xml"/>
          <ivy:install from="${from.resolver}" to="${to.resolver}" transitive="true"
                       organisation="org.apache.commons" module="commons-math" revision="1.2"/>
        </target>
      
      </project>
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            jediry Ryan Saunders
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated: