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

Generated default module descriptors with extra attributes are not working because of missing namespace

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 2.2.0, 2.3.0-RC1
    • None
    • Core

    Description

      The following three files

      ivysettings.xml
      <?xml version="1.0" encoding="UTF-8"?>
      
      <ivysettings>
              <settings defaultResolver="default"/>
              <include url="${ivy.default.settings.dir}/ivysettings-public.xml"/>
              <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
              <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/>
              <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
              <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/>
      
              <resolvers>
                      <url name="launch4j">
                              <artifact pattern="http://downloads.sourceforge.net/project/launch4j/launch4j-3/[revision]/[artifact]-[revision]-[classifier].[ext]" />
                      </url>
              </resolvers>
              <modules>
                      <module organisation="net.sf.launch4j" resolver="launch4j" />
              </modules>
      </ivysettings>
      
      ivy.xml
      <?xml version="1.0" encoding="UTF-8"?>
      
      <ivy-module version="2.0"
                  xmlns:e="http://ant.apache.org/ivy/extra"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
      
              <info organisation="com.example" module="ivy"/>
      
              <configurations confmappingoverride="true"
                              defaultconfmapping="%->default">
                      <conf name="launch4j"/>
              </configurations>
      
              <dependencies defaultconf="compile;sources;javadoc">
                      <dependency org="net.sf.launch4j" name="launch4j" rev="3.0.2" conf="launch4j">
                              <artifact name="launch4j" e:classifier="win32" type="zip"/>
                              <artifact name="launch4j" e:classifier="macosx" type="tgz"/>
                              <artifact name="launch4j" e:classifier="linux" type="tgz"/>
                      </dependency>
              </dependencies>
      </ivy-module>
      
      build.xml
      <?xml version="1.0"?>
      
      <project default="retrieve" xmlns:ivy="antlib:org.apache.ivy.ant">
              <target name="check-ivy">
                      <available property="ivy.jar.present"
                                 file="lib/ivy/ivy-2.2.0.jar"
                                 type="file"/>
              </target>
      
              <target name="download-ivy"
                      depends="check-ivy"
                      unless="ivy.jar.present">
                      <mkdir dir="lib/ivy"/>
                      <get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/2.2.0/ivy-2.2.0.jar"
                           dest="lib/ivy/ivy-2.2.0.jar"
                           usetimestamp="true"/>
              </target>
      
              <target name="init-ivy"
                      depends="download-ivy">
                      <property name="ivy.retrieve.pattern"
                                value="lib/[conf]/[artifact](-[classifier]).[ext]"/>
                      <taskdef resource="org/apache/ivy/ant/antlib.xml"
                               classpath="lib/ivy/ivy-2.2.0.jar"
                               loaderref="ivy.loader"
                               uri="antlib:org.apache.ivy.ant"/>
                      <ivy:settings file="ivysettings.xml"/>
              </target>
      
              <target name="retrieve"
                      description="retrieve the dependencies"
                      depends="init-ivy">
                      <ivy:retrieve sync="true"/>
                      <ivy:retrieve pattern="lib/ivy/[artifact]-[revision].[ext]"
                                    organisation="org.apache.ivy"
                                    module="ivy"
                                    revision="2.2.0"
                                    conf="default"
                                    inline="true"/>
              </target>
      </project>
      

      produce the following file

      ~/.ivy2/cache/net.sf.launch4j/launch4j/ivy-3.0.2.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <ivy-module version="2.0">
              <info organisation="net.sf.launch4j"
                      module="launch4j"
                      revision="3.0.2"
                      status="release"
                      publication="20111120230713"
                      default="true"
              />
              <configurations>
                      <conf name="default" visibility="public"/>
              </configurations>
              <publications>
                      <artifact name="launch4j" type="zip" ext="zip" conf="default" classifier="win32"/>
                      <artifact name="launch4j" type="tgz" ext="tgz" conf="default" classifier="macosx"/>
                      <artifact name="launch4j" type="tgz" ext="tgz" conf="default" classifier="linux"/>
              </publications>
      </ivy-module>
      

      In this file, the classifier attributes do not have a namespace which will cause validation to fail and the build cannot be done offline, because launch4j is redownloaded on every retrieve like seen here:

      [ivy:retrieve] 	problem while parsing cached ivy file for: net.sf.launch4j#launch4j;3.0.2: [xml parsing: ivy-3.0.2.xml:14:85: cvc-complex-type.3.2.2: Attribute 'classifier' is not allowed to appear in element 'artifact'. in file:/home/vampire/.ivy2/cache/net.sf.launch4j/launch4j/ivy-3.0.2.xml
      [ivy:retrieve] , xml parsing: ivy-3.0.2.xml:15:86: cvc-complex-type.3.2.2: Attribute 'classifier' is not allowed to appear in element 'artifact'. in file:/home/vampire/.ivy2/cache/net.sf.launch4j/launch4j/ivy-3.0.2.xml
      [ivy:retrieve] , xml parsing: ivy-3.0.2.xml:16:85: cvc-complex-type.3.2.2: Attribute 'classifier' is not allowed to appear in element 'artifact'. in file:/home/vampire/.ivy2/cache/net.sf.launch4j/launch4j/ivy-3.0.2.xml
      
      ...
      
      [ivy:retrieve] 	 trying http://downloads.sourceforge.net/project/launch4j/launch4j-3/3.0.2/launch4j-3.0.2-win32.zip
      [ivy:retrieve] 		tried http://downloads.sourceforge.net/project/launch4j/launch4j-3/3.0.2/launch4j-3.0.2-win32.zip
      [ivy:retrieve] 	launch4j: no ivy file found for net.sf.launch4j#launch4j;3.0.2: using default data
      
      ...
      
      [ivy:retrieve] :: resolution report :: resolve 790ms :: artifacts dl 4ms
      	---------------------------------------------------------------------
      	|                  |            modules            ||   artifacts   |
      	|       conf       | number| search|dwnlded|evicted|| number|dwnlded|
      	---------------------------------------------------------------------
      	|     launch4j     |   1   |   1   |   0   |   0   ||   3   |   0   |
      	---------------------------------------------------------------------
      

      In DefaultModuleDescriptor.newDefaultInstance() line 112 getExtraAttributes() is used and thus the namespace is lost. Even if getQualifiedExtraAttributes() would be used this would not suffice, as then the namespace declaration is missing and again the validation would fail.

      Attachments

        Activity

          People

            Unassigned Unassigned
            vampire Björn Kautler
            Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: