Java 如何让Ivy从Nexus repo下载资源

Java 如何让Ivy从Nexus repo下载资源,java,maven,ivy,nexus,ivyde,Java,Maven,Ivy,Nexus,Ivyde,我一直在寻找解决我问题的方法,但是我遇到的其他帖子要么不起作用,要么不符合我的情况,所以希望有人能给我一些启示 我有一个用ant构建的库,它输出2个jar文件,一个正常包含库的编译版本,另一个只包含源文件 此库上载到我们的Nexus存储库,打包设置为jar。对于实际的jar文件,我将扩展名设置为jar,并将分类器留空。对于源jar,我将分类器设置为sources,将扩展设置为jar 无论我如何处理我的ivy.xml文件,我都无法让它下载源jar。根据我在别处读到的帖子,我尝试添加: conf="

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

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

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

无论我如何处理我的ivy.xml文件,我都无法让它下载源jar。根据我在别处读到的帖子,我尝试添加:

conf="*->default,sources"
到我的依赖项,但我得到一个错误:

configuration not found in org#name;version: 'sources'
所以这基本上是希望我的库将源定义为某个配置?我认为它只会发现一个事实,即存储库中还有另一个将分类器设置为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>
更新 以下是已解析的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>


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

在你的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>

注:

  • Maven模块由ivy翻译成标准配置集。有关更多详细信息,请参阅
在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>

发布工件时,您应该告诉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源代码和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}"/>

...
...

因此,经过多次尝试,我似乎终于找到了解决方案。如果我以以下方式声明依赖项:

<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文件中包含sources配置,除非像我上面所做的那样明确要求它。

对于上面的Ivy文件,我指定在ant属性文件中运行哪个配置,或者在Eclipse中使用IvyDE(在我的情况下,我正在运行的是PDA配置)@达维约翰斯顿我读对了吗?您不使用ivy的发布任务,而是手动将JAR和上面的ivy.xml复制到repo?如果在这种情况下,您的ivy.xml缺少检索所需的发布标记。上述ivy.xml文件不会复制到repo,而是该项目的ivy文件依赖于repo中的库。该ivy文件中没有发布标记,因为只有一个输出,即与模块同名的jar文件。您可以从repo获取/发布实际的ivy.xml吗?repo中没有ivy.xml文件,它是maven repo,因此有一个pom文件。这大致上是我已经尝试过的,但它抱怨在我的依赖项中找不到conf源。在将依赖项添加到nexus以添加源配置时,是否需要对其进行某些处理?我认为当我添加一个带有分类器源的人工制品时,它会自动做到这一点。“源”配置应该在所有远程Maven模块中都可用(请参阅我上面答案中的链接)。你能用收到的错误更新你的帖子吗?此外,您需要告诉我您的配置映射(ivy.configuration属性的值)。。。。基本上,我目前不知道如何重现您的问题…我已使用收到的错误消息和配置值编辑了我的问题。您没有为属性“ivy.configuration”提供值。其次,从错误消息中可以清楚地看出,您的构建没有为属性“ivy.organization”提供价值。。。。所以,让我猜“ivy.configuration”类似于“pda->sources”。。。因此,ivy正在远程模块“my.org#myLib”中寻找源配置。。。查看解析常春藤文件。没有消息来源!但是如何将此配置信息发布到Nexus repo?到目前为止,我已经使用Ant发布了这些人工制品,然后手动将它们上传到Nexus。这涉及选择属于库的文件并分配分类器(例如源)。那么,Nexus中存储的库配置信息在哪里呢?
<dependency name="myLib" org="my.org" rev="0.0.+">
    <artifact type="jar"/>
    <artifact type="source" m:classifier="sources" conf="pdaDev->sources"/>
</dependency>