【问题标题】:how to publish 3rdparty artifacts with ivy and nexus如何使用 ivy 和 nexus 发布 3rdparty 工件
【发布时间】:2011-07-03 23:12:26
【问题描述】:

我正忙着用常春藤弄湿我的脚。我在本地 PC 上运行了一个现有的 nexus 存储库,以及一个现有的 ant 构建脚本。
两者都工作正常。

部分构建脚本有一些文件可以从网络共享中检索我们的 3rdparty jar 文件(log4j、xmlbeans、junit、pdf 等)——这充其量是 klunky。

我想使用 ivy 的依赖机制从 nexus 存储库中检索这些文件并在构建中使用它们。每个 3rdparty 库都有一个名称和一组任意文件(jar、dll、license.dat、xml 等)。

由于我们有大量这些 3rdparty 库,并且每个库都有多个文件 - 手动上传到 nexus 不是一种选择 - 我需要一些可以用来获取一组文件的东西,给它们一个库名称,a版本号并将结果上传到nexus。那么我需要能够从 ivy 中检索它。

我设法让上传部分工作,但检索过程不起作用。使用我们的 xmlbeans 库作为起点,我创建了以下 ivy.xml 文件

<ivy-module version="1.0">  
<info organisation="thirdparty_tools" module="xmlbeans" status="integration">  
<publications>  
  <artifact name="jsr173_api" type="jar" ext="jar"/>  
  <artifact name="saxon-dom" type="jar" ext="jar"/>  
  <artifact name="saxon-xpath" type="jar" ext="jar"/>  
  <artifact name="saxon" type="jar" ext="jar"/>  
  <artifact name="xbean" type="jar" ext="jar"/>  
  <artifact name="xbean_xpath" type="jar" ext="jar"/>  
  <artifact name="xmlpublic" type="jar" ext="jar"/>  
</publications>  
</ivy-module>  

然后一些 ant 脚本将其发布到 nexus:

 <ivy:resolve/>  
    <ivy:publish <ivy:publish resolver="thirdparty" forcedeliver="true" update="true" revision="${version}" overwrite="true">  
      <artifacts pattern="[artifact].[ext]"/>  
    <ivy:publish/>  

这一切都很好。它将所有 jar 文件发布到预期目录中的 nexus。

当我尝试在我的构建中使用它时,问题就来了。 我为我的构建创建了以下 ivy.xml 文件:

<ivy-module version="1.0">  
    <info organisation="myCompany" module="GLB_Data"/>  
    <dependencies>  
        <dependency org="thirdparty_tools" name="xmlbeans" rev="2.2.0"/>  
    </dependencies>  
</ivy-module> 

然后当我运行我的构建时 - 它找不到任何东西:

::::::::::::::::::::::::::::::::::::::::::::::  
::          UNRESOLVED DEPENDENCIES         ::  
::::::::::::::::::::::::::::::::::::::::::::::  
:: thirdparty_tools#jsr173_api;2.2.0: not found  
:: thirdparty_tools#saxon-dom;2.2.0: not found  
:: thirdparty_tools#saxon-xpath;2.2.0: not found  
:: thirdparty_tools#saxon;2.2.0: not found  
:: thirdparty_tools#xbean;2.2.0: not found  
:: thirdparty_tools#xbean_xpath;2.2.0: not found  
:: thirdparty_tools#xmlpublic;2.2.0: not found  
:::::::::::::::::::::::::::::::::::::::::::::: 

问题似乎出在这种模式上:

WARN: ==== public: tried  
WARN:   http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.pom  
WARN:   -- artifact thirdparty_tools#jsr173_api;2.2.0!jsr173_api.jar:  
WARN:   http //localhost:8081/nexus/content/groups/public/thirdparty_tools/jsr173_api/2.2.0/jsr173_api-2.2.0.jar  

ivy seems to be looking for the jsr173_api artifact under its own name, rather than under the xmlbeans folder where it was published to:  
[ivy:publish]   published jsr173_api to http //localhost:8081/nexus/content/repositories/thirdparty/thirdparty_tools/xmlbeans/2.2.0/jsr173_api-2.2.0.jar  

(混淆网址以防止发生事故)。

所以不知何故,我需要以不同的方式发布,或以不同的方式检索。非常感谢您的想法和建议。

【问题讨论】:

    标签: ant ivy nexus


    【解决方案1】:

    Nexus 主要是一个 Maven 存储库,这意味着必须适应 Maven 构建工件的方式。

    由于您专注于批量加载 Nexus,我建议您查看以下问题的答案:

    Upload artifacts to Nexus, without Maven

    如果你想坚持常春藤,请继续阅读.....

    背景

    需要一个 Maven POM

    您的第一个问题是您的 Maven 模块将需要一个 POM 文件。该文件描述了 maven 模块,可以很容易地从 ivy.xml 文件的内容生成(参见下面的解决方案)。

    其次,Maven 假设正在构建一个主要工件。例如:

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.myspotontheweb</groupId>
      <artifactId>donaldduck</artifactId>
      <version>1.0.1</version>
      <packaging>txt</packaging>
    </project>
    

    Maven 客户端会将此信息转换为以下 URL:

    http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1.txt
    

    这演示了 Nexus 如何存储任何类型的二进制依赖项。 packaging 参数默认为“jar”。

    maven 如何处理额外的模块工件

    虽然 Maven 专注于单个构建工件,但可以通过将它们发布到同一目录中来添加其他补充工件(就像您所做的那样)。

    这些在 Maven POM 中列出。相反,Maven 使用特殊的“分类器”属性。下面是一个可能的依赖声明。

    <dependency>
      <groupId>com.myspotontheweb</groupId>
      <artifactId>donaldduck</artifactId>
      <version>1.0.1</version>
      <classifier>metadata</classifier>
      <type>n3</type>
    </dependency>
    

    Maven 客户端会将其转换为以下 URL:

    http://<host>/<repo>/com/myspotontheweb/donaldduck/1.0.1/donaldduck-1.0.1-metadata.n3
    

    开源项目通常以这种方式发布其源代码。

    常春藤溶液

    那么最后如何使用 ivy 将文件发布到 Nexus?

    首先确定哪个工件是“主要”构建工件并为您的 POM 文件添加一个附加条目:

    <ivy-module version='2.0' xmlns:e="http://ant.apache.org/ivy/extra">
    
        <info organisation="com.myspotonontheweb" module="donaldduck" revision="1.0.1"/>
    
        <publications>
            <artifact name="donaldduck" type="txt"/>
            <artifact name="donaldduck" type="pom"/>
            <artifact name="donaldduck" type="n3" e:classifier="metadata"/>
            <artifact name="donaldduck" type="zip" e:classifier="disto"/>
        </publications>
    
    </ivy-module>
    

    也可以列出其他文件,但每个文件都必须具有唯一的 classifier 属性.....在这里,您将面临将 ANT 项目转换为 Maven 的经典问题之一... . 你发布的每个 jar 文件,可能都需要有一个单独的 POM。它们并不是真正的“补充”工件.....

    假装您不需要发布多个模块......使用以下构建目标来发布您的模块:

    <target name="prepare" description="Generate POM">
        <!-- Optional: Intermediate file containing resolved version numbers -->
        <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>
    
        <!-- Generate the Maven POM -->
        <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/>
    </target>
    
    <target name="publish" depends="init,prepare" description="Upload to Nexus">
        <ivy:publish resolver="nexus-deploy" pubrevision="${publish.revision}" overwrite="true" publishivy="false" >
            <artifacts pattern="${build.dir}/[artifact](-[classifier]).[ext]"/>
        </ivy:publish>
    </target>
    

    Nexus 凭据

    为了完整起见,这里是 ivysettings.xml 文件,其中包含 Nexus 存储库位置和凭据:

    <ivysettings>
        <settings defaultResolver="nexus-central"/>
        <credentials host="somehost" realm="Sonatype Nexus Repository Manager" username="????" passwd="????"/>
        <resolvers>
            <ibiblio name="nexus-central" root="http://somehost/nexus/content/repositories/central/" m2compatible="true"/>
            <ibiblio name="nexus-deploy" root="http://somehost/nexus/content/repositories/repo" m2compatible="true"/>
        </resolvers>
    </ivysettings>
    

    更新

    下载工件

    要检索所有已发布的工件(不仅仅是主要的),您需要按如下方式列出它们:

    <dependency org="com.myspotontheweb" name="donaldduck" rev="1.0.1">
        <artifact name="donaldduck" type="txt"/>
        <artifact name="donaldduck" type="n3" e:classifier="metadata"/>
        <artifact name="donaldduck" type="zip" e:classifier="distro"/>
    </dependency>
    

    功能与以下 Maven 片段相同:

    <dependency>
      <groupId>com.myspotontheweb</groupId>
      <artifactId>donaldduck</artifactId>
      <version>1.0.1</version>
      <type>txt</type>
    </dependency>
    
    <dependency>
      <groupId>com.myspotontheweb</groupId>
      <artifactId>donaldduck</artifactId>
      <version>1.0.1</version>
      <classifier>metadata</classifier>
      <type>n3</type>
    </dependency>
    
    <dependency>
      <groupId>com.myspotontheweb</groupId>
      <artifactId>donaldduck</artifactId>
      <version>1.0.1</version>
      <classifier>distro</classifier>
      <type>zip</type>
    </dependency>
    

    【讨论】:

    • 好吧,我忘了说我有点熟悉 maven 是如何做事的。我希望找到解决每个模块 1 个工件的方法。但除此之外——我可以为单个工件做你描述的事情,但这里的主要关键是我想以某种方式发布多个文件,然后在我的 ivy.xml 文件中使用 single 条目来引用它们在蚂蚁构建中。除非我错过了一些基本的东西,否则你提供的内容需要我单独列出每个文件——这是我拼命想要避免的。
    • 所以我去添加了一个条目:&lt;artifact name="xmlbeans" type="pom"/&gt; 到我的 ivy.xml 文件并重新发布。它按预期创建了一个 pom 文件(thirdparty_tools/xmlbeans/2.2.0/xmlbeans-2.2.0.pom)。然而......常春藤不是在寻找那个。它想要一个名为:thirdparty_tools/xmlbeans/2.2.0/xmlbeans-2.2.0.xml 的文件,它不存在。所以我将条目更改为:&lt;artifact name="xmlbeans" type="pom" ext="xml"/&gt;,它按预期工作。
    • 好的 - 这不起作用。这些错误在解决后消失了,但是当我进行检索时没有下载任何内容。实际上只有 .pom 文件被下载,但我想要工件(.zip .dll 等)。
    • 我重新测试了它,它对我有用。从 Nexus 存储库下载时,您是否正确声明了解析器?
    • 对于解析器我有这个:&lt;ibiblio name="thirdparty" m2compatible="true" root="http://localhost:8081/nexus/content/repositories/thirdparty/"/&gt; 至于下载东西 - 问题似乎是在下载过程中忽略了 ivy.xml 文件,而所有 ivy 看到的是 pom 文件,以及它具有的任何依赖项。 真正让我感到困惑的是,ivy 创建了用于发布的 URL。但 ivy 不能使用相同的 URL 来下载内容。这告诉我,ivy 的设置或我对其工作原理的理解存在根本缺陷。
    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 2012-04-29
    • 2015-03-11
    • 2017-06-21
    • 2011-10-28
    • 2018-12-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多