【问题标题】:ivy:resolve removing confs from descriptor常春藤:解决从描述符中删除配置文件
【发布时间】:2012-06-14 12:39:35
【问题描述】:

我有一个使用 Ivy 和 Ant 构建并发布到 Artifactory 的实用程序项目:

utils 项目的ivy.xml:

<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:m="http://ant.apache.org/ivy/maven"
            xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
            version="2.0">
    <info organisation="org.abc" module="utils"/>

    <configurations defaultconfmapping="%->default,sources">
        <conf name="default"/>
        <conf name="sources"/>
        <conf name="compile-main" extends="default" visibility="private" transitive="false"/>
        <conf name="compile-test" extends="compile-main" visibility="private" transitive="false"/>
        <conf name="run-test" extends="compile-test" visibility="private" transitive="true"/>
    </configurations>

    <publications>
        <artifact name="utils" type="jar"/>
        <artifact name="utils-src" type="source" ext="zip" conf="sources" m:classifier="sources"/>
    </publications>

    <dependencies>
        <--snip... -->
    </dependencies>
</ivy-module>

这很好用。我可以看到 JAR、-sources.zip 和 Ivy 描述符很好地发布到 Artifactory。

然后我尝试在依赖项目中使用这个 JAR:

依赖项目的ivy.xml:

<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:m="http://ant.apache.org/ivy/maven"
            xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
            version="2.0">
    <info organisation="org.abc" module="dependent"/>

    <configurations defaultconfmapping="%->default,sources">
        <conf name="default"/>
        <conf name="compile-main" extends="default" visibility="private" transitive="false"/>
        <conf name="compile-test" extends="compile-main" visibility="private" transitive="false"/>
        <conf name="run-test" extends="compile-test" visibility="private" transitive="true"/>
    </configurations>

    <dependencies> 
        <dependency org="org.abc" name="utils" rev="latest.integration" conf="default"/> 
        <!-- snip... -->
    </dependencies>
</ivy-module>

如果我将依赖项目的defaultconfmapping 更改为%-&gt;default,一切正常。当我将defaultconfmapping 设置为%-&gt;default,sources 时,其他依赖项(JUnit、log4j 等)的源可以正常下载,但我的 utils 项目的源出现错误:

[ivy:resolve] :: problems summary ::
[ivy:resolve] :::: WARNINGS
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       ::          UNRESOLVED DEPENDENCIES         ::
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       :: org.abc#utils;20120611153645: configuration not found in org.abc#utils;20120611153645: 'sources'. It was required from org.abc#dependent;working@blah.abc.org default
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::

有趣的是,如果我查看 Ivy 缓存内部,Ivy XML 文件如下所示:

<ivy-module version="2.0">
    <info organisation="org.abc"
            module="utils"
            revision="20120611153645"
            status="release"
            publication="20120611154459"
            default="true"
    />
    <configurations>
            <conf name="default" visibility="public"/>
    </configurations>
    <publications>
            <artifact name="utils" type="jar" ext="jar" conf="default"/>
    </publications>
</ivy-module>

因此,出于某种原因,Ivy 决定在解析过程中从描述符中删除所有私有 conf(有意义)+ 源 conf + 源工件。我终其一生都无法理解为什么。我可以看到 XML 文件在 Artifactory 中很好——就像我写的一样。那么为什么 Ivy 在解决它时会放弃源信息呢?

作为参考,这是我的 Ant 脚本的早期部分:

<ivy:configure url="http://repo:8081/artifactory/simple/bootstrap-local/ivysettings.xml"/>
<ivy:resolve log="downloadOnly"/>
<fail message="Go check out the cache file now"/> <!-- added to find out whether resolve or retrieve broke it -->

困惑!

【问题讨论】:

    标签: ivy artifactory


    【解决方案1】:

    无法重现您的问题。也许这个工作示例会有所帮助......

    测试

    |-- proj1
    |   |-- build.xml
    |   `-- ivy.xml
    `-- proj2
        |-- build.xml
        `-- ivy.xml
    

    如下运行构建后

    ant -f ./proj1/build.xml
    ant -f ./proj2/build.xml
    

    有如下文件结构

    |-- proj1
    |   |-- build
    |   |   |-- ivy.xml
    |   |   |-- utils.jar
    |   |   `-- utils-src.zip
    |   |-- build.xml
    |   `-- ivy.xml
    `-- proj2
        |-- build.xml
        |-- ivy.xml
        `-- lib
            `-- utils-20120612011906.jar
    

    项目1

    构建.xml

    <project name="demo" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
    
        <target name="init">
            <echo file="build/utils.jar"/>
            <echo file="build/utils-src.zip"/>
        </target>
    
        <target name="run" depends="init">
            <ivy:resolve/>
    
            <ivy:publish resolver="local">
                <artifacts pattern="build/[artifact].[ext]" />
            </ivy:publish>    
        </target>
    
    </project>
    

    ivy.xml

    <ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:m="http://ant.apache.org/ivy/maven"
                xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
                version="2.0">
        <info organisation="org.abc" module="utils"/>
    
        <configurations>
            <conf name="default"/>
            <conf name="sources"/>
        </configurations>
    
        <publications>
            <artifact name="utils" type="jar" conf="default"/>
            <artifact name="utils-src" type="source" ext="zip" conf="sources" m:classifier="sources"/>
        </publications>
    
    </ivy-module>
    

    proj2

    构建.xml

    <project name="demo" default="run" xmlns:ivy="antlib:org.apache.ivy.ant">
    
        <target name="run">
            <ivy:retrieve/>
        </target>
    
    </project>
    

    ivy.xml

    <ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:m="http://ant.apache.org/ivy/maven"
                xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
                version="2.0">
        <info organisation="org.abc" module="utils-use"/>
    
        <configurations>
            <conf name="default"/>
            <conf name="sources"/>
        </configurations>
    
        <dependencies>
            <dependency org="org.abc" name="utils" rev="latest.integration" conf="default"/> 
        </dependencies>
    
    </ivy-module>
    

    【讨论】:

    • 感谢您的回复马克。我会在我上班的时候试一试,然后告诉你我的进展情况。
    • 我已经试过你的例子,但它并没有达到我想要的效果。具体来说,在proj2中,需要添加defaultconfmapping="%-&gt;default,sources"。但是,当我这样做时,一切正常!然而,当我通过 Artifactory 发布和解析时,我发现缓存的描述符与我描述的一样(即,除了默认值之外的所有 confs 都被删除)。所以我想这是一个 Artifactory 问题。我会进一步挖掘。感谢您让我走上正确的道路!
    猜你喜欢
    • 2013-08-17
    • 2011-04-12
    • 2013-05-31
    • 2010-11-12
    • 2011-10-26
    • 2017-01-03
    • 2015-10-28
    • 2018-03-24
    相关资源
    最近更新 更多