【问题标题】:How to get Ivy to download sources from Nexus repo如何让 Ivy 从 Nexus repo 下载资源
【发布时间】:2012-04-28 23:28:00
【问题描述】:

我多年来一直在寻找解决问题的方法,但我遇到的所有其他帖子要么不起作用,要么不符合我的情况,所以希望有人能给我一些见解.

我有一个使用 ant 构建的库,它输出 2 个 jar 文件,一个正常包含库的编译版本,另一个仅包含源文件。

这个库被上传到我们的 Nexus 存储库,打包设置为 jar。对于实际的 jar 文件,我将扩展名设置为 jar 并将分类器留空。对于源 jar,我将分类器设置为源,将扩展名设置为 jar。

无论我用 ivy.xml 文件做什么,我都无法下载源 jar。根据我在其他地方阅读的帖子,我尝试添加:

conf="*->default,sources"

到我的依赖,但后来我得到一个错误:

configuration not found in org#name;version: 'sources'

所以这基本上是期望我的库将源定义为某处的配置?我认为它只会发现另一个人工制品,其中分类器设置为存储库中的源。

任何人都可以就我将库发布到 Nexus 的方式或我在 Ivy 文件中设置依赖项声明的方式给出其他建议。

这是基本的 Ivy.xml 文件,我在其中定义我对放在 Nexus 中的库的依赖关系。

<ivy-module version="2.0">

    <info organisation="${ivy.organisation}" module="moduleName" />

    <configurations>
        <conf name="pda" description="moduleName for PDA"/>
        <conf name="server" description="moduleName for server"/>
    </configurations>

    <dependencies>
        <!-- Internal -->
        <dependency name="utility" org="${ivy.organisation}" rev="latest.integration" conf="${ivy.configuration}"/>
        <dependency name="myLib" org="my.org" rev="0.0.+"/>
    </dependencies>

</ivy-module>

为了响应下面的 cmets,ivy.configuration 属性在我的 Ant 的 build.properties 中设置为 pda。对于 Eclipse,我创建了一个属性文件,并将 ivy.configuration 设置为 pda(然后在 Eclipse 的 Ivy 设置中引用此属性文件)。

我得到的错误信息是:

Some projects fail to be resolved
    Impossible to resolve dependencies of ${ivy.organisation}#moduleName;working@host
        unresolved dependency: my.org#myLib;0.0.+: configuration not found in my.org#myLib;0.0.0: 'sources'. It was required from ${ivy.organisation}#moduleName;working@host pda

更新 这是解析后的 ivy.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
    <info organisation="my.org"
        module="myLib"
        revision="0.0.0"
        status="release"
        publication="20120419131909"
        default="true"
    />
    <configurations>
        <conf name="default" visibility="public"/>
    </configurations>
    <publications>
        <artifact name="myLib" type="jar" ext="jar" conf="default"/>
    </publications>
</ivy-module>

这显然解释了为什么它无法找到“来源”conf。但是我的印象是应该自动添加源conf,因为我已经将源添加到了Nexus。

【问题讨论】:

  • 对于上面的 ivy 文件,我指定在我的 ant 属性文件中运行哪个配置,或者在 Eclipse 中使用 IvyDE(在我的情况下,它是我正在运行的 PDA 配置)
  • @DaveJohnston 我没看错吗?你不使用ivy的发布任务,而是手动将jar和上面的ivy.xml复制到repo?如果是这种情况,您的 ivy.xml 缺少发布标记,则需要检索。
  • 上面的ivy.xml文件并没有复制到repo,它是repo中依赖于库的项目的ivy文件。该 ivy 文件中没有发布标签,因为只有一个输出,即与模块同名的 jar 文件。
  • 你能从 repo 中获取/发布实际的 ivy.xml 吗?
  • repo中没有ivy.xml文件,是maven repo,所以有pom文件。

标签: java maven ivy nexus ivyde


【解决方案1】:

您应该在发布工件时告诉 Ivy 配置。例如:

<ivy-module version="2.0">
    <info organisation="apache" module="commons-lang" revision="2.5" status="release"/>
    <configurations>
        <conf name="binary" description="provide only binary files"/>
        <conf name="development" extends="binary" description="provide binary files with javadoc and sources"/>
    </configurations>
    <publications>
        <artifact name="commons-lang" ext="jar" conf="binary" type="jar"/>
        <artifact name="commons-lang-javadoc" ext="jar" conf="development" type="javadoc"/>
        <artifact name="commons-lang-sources" ext="jar" conf="development" type="source"/>
    </publications>
</ivy-module>

如您所见,commons-lang.jar 在二进制配置下发布。但是 commons-lang-sources 和 commons-lang-javadoc 在开发配置下发布。

当您检索依赖项时,您应该使用以下 ivy.xml:

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info organisation="bitrete" module="strongpoint" status="development"/>
    <configurations>
        <conf name="binary" description="provide only binary files"/>
        <conf name="development" extends="binary" description="provide binary files with javadoc and sources"/>
    </configurations>
    <publications>
        <artifact name="strongpoint" ext="jar" type="jar"/>
    </publications>
    <dependencies>
        <dependency org="apache" name="commons-lang" rev="2.5"/>
    </dependencies>
</ivy-module>

并在使用 Ant 解析时提供所需的配置:

<property name="ivy.conf" value="binary"/>
...
<property name="ivy.conf" value="development"/>
...
<ivy:resolve conf="${ivy.conf}"/>

【讨论】:

  • 但是如何将此配置信息发布到 Nexus 存储库?到目前为止,我已经使用 Ant 发布了这些人工制品,然后手动将它们上传到 Nexus。这涉及选择哪些文件属于库并分配分类器(例如源)。那么 Nexus 中存储的库的配置信息在哪里呢?
【解决方案2】:

所以在玩了很多之后,我似乎终于找到了解决方案。如果我通过以下方式声明我的依赖关系:

<dependency name="myLib" org="my.org" rev="0.0.+">
    <artifact type="jar"/>
    <artifact type="source" m:classifier="sources" conf="pdaDev->sources"/>
</dependency>

然后我可以添加一个新配置(例如上面的 pdaDev),它链接到依赖项的源配置。使用 Eclipse 时,我可以告诉它使用 pdaDev 配置,它也会拉入源 jar(如果存在)。

Nexus 似乎没有在解析的 Ivy 文件中包含源配置似乎很奇怪,除非像我上面所做的那样明确要求它。

【讨论】:

    【解决方案3】:

    在您的 ivy 文件中创建两个配置。一个用于应该在类路径中的二进制文件,另一个用于源 jar。

    其次,在依赖上创建两个配置映射:

    <ivy-module version="2.0">
        <info organisation="org.demo" module="demo"/>
        <configurations>
            <conf name="compile" description="jars used for compilation classpath"/>
            <conf name="sources" description="Source jars"/>
        </configurations>
        <dependencies>
            <dependency org="org.slf4j" name="slf4j-simple" rev="1.6.4" conf="compile->default;sources->sources"/>
        </dependencies>
    </ivy-module>
    

    注意:

    在您的 ANT 构建中,您可以使用如下配置:

    <target name="init">
        <ivy:resolve/>
    
        <!-- Populate a compile classpath for use with javac task -->
        <ivy:cachepath pathid="compile.path" conf="compile"/>
    
        <!-- Put source jars in the src directory -->
        <ivy:retrieve pattern="src/[artifact]-[revision](-[classifier]).[ext]" conf="sources"/>
    
    </target>
    

    【讨论】:

    • 这大致是我已经尝试过的,但它抱怨在我的依赖项中找不到 conf 源。将依赖项添加到 nexus 以添加源配置时,我需要对依赖项做些什么吗?我认为当我使用分类器源添加人工制品时它会自动执行此操作。
    • “源”配置应该在所有远程 Maven 模块中都可用(请参阅上面我的答案中的链接)。你能用你得到的错误更新你的帖子吗?此外,您需要告诉我您的配置映射(ivy.configuration 属性的值)...。基本上,我目前不知道如何重现您的问题...
    • 我已经用收到的错误消息和配置值编辑了我的问题。
    • 您没有为属性“ivy.configuration”提供值。其次,从错误消息中可以清楚地看出,您的构建没有为属性“ivy.organisation”提供值......所以,让我猜猜“ivy.configuration”类似于“pda->sources”......所以常春藤正在远程模块“my.org#myLib”中寻找源配置...查看解析常春藤文件。没有来源!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2012-04-24
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2014-02-28
    相关资源
    最近更新 更多