如何使用Ant将具有不同名称的jar发布到Ivy

时间:2011-09-01 02:45:53

标签: ant ivy

我刚刚开始使用Ivy,我真的很挣扎,因为我发现Apache网站上的文档和教程非常混乱,与我想要如何使用它无关。

我想使用Ant将一些jar文件发布到本地Ivy存储库。 Ant脚本创建了四个jar文件:

  • 的sed -WS-client.jar中
  • 的sed -WS-客户src.jar
  • 沉渣 - enums.jar
  • 沉渣 - 枚举-src.jar

这些jar应该最终存放在Ivy存储库中的两个不同目录中(例如sed-ws-client目录和sed-enums目录。存储库目前在相应的目录中包含这些jar的0.0.1和0.0.2版本,以及相应的ivy- [version] .xml文件(这是手动完成的)。

我在弄清楚如何构建“发布”Ant目标和项目的ivy.xml文件时遇到了很多麻烦。我被迫将模块名称放在info文件的ivy.xml标记中,但这意味着我只能将jar发布到Ivy存储库中的一个目录中?

我尝试了各种各样的东西,但Ant构建总是失败。我只想简单解释一下我需要采取哪些步骤才能使其正常工作。如有必要,可以更改存储库结构。

这是我到目前为止所拥有的:

ivy.xml档案:

<ivy-module version="1.0">
<info organisation="myorg" module="SED" revision="1.0" status="dev"></info>

<publications>
    <!-- ws-client -->
    <artifact name="sed-ws-client"/>
    <artifact name="sed-ws-client" type="src"/>

    <!-- generated -->
    <artifact name="sed-enums"/>
    <artifact name="sed-enums" type="src"/>

</publications>

</ivy-module>

Ant目标:

<target name="ivy-publish" description="Produce the ivy.xml file for the built jars">
    <ivy:settings file="d:/temp/ivy/ivysettings.xml" />
    <ivy:retrieve />
    <ivy:publish organisation="myorg" resolver="default" pubrevision="0.0.2" update="true">
        <artifacts pattern="${DEPLOY_DIR}/${sed.ws.client.jar}-[type].[ext]" />
        <artifacts pattern="${DEPLOY_DIR}/${sed.enums.jar}-[type].[ext]" />
    </ivy:publish>
</target>

2 个答案:

答案 0 :(得分:5)

我用2个常春藤文件解决了这个问题,因为我的项目发布了2个模块。每个模块都需要自己的ivy.xml。 这是我的第二个模块的目标,它有自己的常春藤文件(ivy-SI.xml)。

  <target name="ivy-publish-si">
    <ivy:settings file="${basedir}/../KS.build/ivysettings.xml" />
    <!--resolve ist need for publish -->
    <ivy:resolve
      file="ivy-SI.xml"
      revision="${project.version}"
      conf="compile"
    />
    <ivy:publish 
      srcivypattern="ivy-si.xml"
      resolver="jars.local" 
      conf="compile" 
      overwrite="true"
      revision="${project.version}">  
      <artifacts pattern="dist/[artifact]-[revision].[type]" />
    </ivy:publish>

ivy-SI.xml非常标准:

<?xml version="1.0" encoding="UTF-8"?>
<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="readybank" 
  module="KS.SessionInterface" 
  revision="${project.version}"
  status="integration"/>
<configurations>

    <conf name="compile" visibility="public"/>
    <conf name="run" visibility="public"/>
    <conf name="deploy" visibility="public"/>
</configurations>
<publications>
   <artifact name="KS.SessionInterface" type="jar" conf="compile" ext="jar"/>
</publications>
<dependencies>
</dependencies>

</ivy-module>

答案 1 :(得分:3)

您的工件存储在存储库中的方式无关紧要。常春藤通过模块和工件名称寻找工件。 通常您应该将一个项目视为一个常春藤模块。如果您的项目生成两个模块,则将此项目分成两部分的更好方法。模块是逻辑上一致的一起更改的工件集

您的构建失败,因为发布任务无法找到要发布的工件。

例如,在此发布任务中:

<ivy:publish resolver="${ivy.repository}" update="true" overwrite="true">
  <artifacts pattern="${artifacts.dir}/[artifact].[ext]"/>
</ivy:publish>

我们告诉Ivy从$ {artifacts.dir}文件夹中获取ivy.xml中描述的名称和扩展名的工件并发布它们。 在这种情况下,ivy.xml看起来像这样:

<ivy-module version="2.0">
<info organisation="apache" module="commons-cli" revision="1.2" 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-cli" ext="jar" conf="binary" type="jar"/>
    <artifact name="commons-cli-javadoc" ext="jar" conf="development" type="javadoc"/>
    <artifact name="commons-cli-sources" ext="jar" conf="development" type="source"/>
</publications>