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> <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".
<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>