5

我们的情况有点复杂......

在大多数情况下,我们一直在使用 IVY 和 ANT 来管理我们的构建和依赖关系。现在该公司正朝着使用 Maven 的方向发展。我们有一组称为公共库的项目,供几个核心产品使用。

公共库使用 IVY 并发布到 IVY 存储库。我们还需要为我们的新 Maven 项目提供通用库。因此,当构建和发布公共库时,我修改了脚本以发布到 Maven(Artifactory)以及 IVY。以下是发布已构建的 IVY 项目时现在调用的两个目标:

<target name="publish-ivyrepo" depends="load-ivysettings">
    <ivy:resolve file="ivy.xml"  /> 
    <ivy:publish 
        module="${ant.project.name}"
        artifactspattern="${dist.dir}/[artifact].[ext]" 
        resolver="integration" 
        pubrevision="${build.version}" 
        status="integration"    
        overwrite="true"
        update="true"/>
</target>

<target name="publish-artifactory" depends="load-ivysettings">
    <ivy:resolve file="ivy.xml"  /> 
    <ivy:publish 
        module="${ant.project.name}"
        artifactspattern="${dist.dir}/[artifact].[ext]" 
        resolver="artifactory" 
        pubrevision="${build.version}-SNAPSHOT" 
        status="integration"    
        overwrite="true"
        update="true"/>
</target>

这是详细说明解析器的 IVY 设置:

<sftp name="integration" checkmodified="true" changingPattern=".*" host="host" user="ivy" userPassword="abc">
  <ivy pattern="${ivy.integration.default.root}/${ivy.public.default.ivy.pattern}"/>
  <artifact pattern="${ivy.integration.default.root}/${ivy.public.default.artifact.pattern}"/>
</sftp>
<url name="artifactory" checkmodified="false" changingPattern=".*" m2compatible="true">
  <ivy pattern="http://server/artifactory/libs-snapshot-local/${maven.default.ivy.pattern}"/>
  <artifact pattern="http://server/artifactory/libs-snapshot-local/${maven.default.artifact.pattern}"/>
</url>

我现在在 Artifactory 中看到了常见的库 jar,其中 SNAPSHOT 代替了唯一的时间戳。但是,源 jar 和 IVY xml 文件没有替换 SNAPSHOT。此外,没有生成 POM 文件(尽管我不知道这是否有必要。

所以这似乎没问题,尽管关于 POM 文件的需求以及 IVY xml 和源 jar 的版本命名存在一些问题。但是,当我现在继续指定从 Maven 项目之一到公共库项目的 SNAPSHOT 版本之一的依赖关系时,它抱怨它无法解决依赖关系:

缺少工件 com.smartstream.common_library:common_library_dao:jar:4.0.0.5-4-SNAPSHOT:compile

我尝试通过 POM 文件和 Maven 设置文件将存储库指定给 Artifactory,但收效甚微:

<repository>
    <id>test</id>
    <name>simple test</name>
    <url>http://server/artifactory/libs-snapshot</url>
    <releases>
        <enabled>false</enabled>
    </releases>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

奇怪的是,如果我让 IVY 发布一个版本而不是 SNAPSHOT 到 Artifactory 的 libs-release-local 存储库中,所有解决方案都如您所愿。此外,如果我将唯一时间戳指定为依赖版本的一部分(SNAPSHOT 的替代品),它也会解决它。所以这表明 Maven 项目能够解决 Artifactory,只是 SNAPSHOT 版本出了点问题。

在这个问题上,我一直在四处寻找,几乎没有希望。如果您能提供任何见解,将不胜感激。

4

2 回答 2

7

从 ivy 发布到 Nexus 存储库已在此处得到解答:

如何使用 ivy 和 nexus 发布 3rdparty 工件

这个答案可能太全面了。相关部分的标题为“常春藤解决方案”。我在这里总结一下:

例子

常春藤.xml

您需要一个发布部分,说明您正在发布一个 jar 并且它是关联的 POM:

<ivy-module version='2.0'>
    <info organisation="com.myspotonontheweb" module="donaldduck"/>

    <publications>
        <artifact name="donaldduck" type="jar"/>
        <artifact name="donaldduck" type="pom"/>
    </publications>

    ..
    ..

</ivy-module>

笔记:

  • 另一个例子更复杂,展示了如何将额外的工件添加到 Maven 模块中。

常春藤设置.xml

我正在使用ibiblio解析器,并打开了 Maven 2 兼容性。以我的经验,这是在 ivy 中配置 Maven 存储库的最佳方式。

<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>

笔记:

  • 对于人工制品,凭证领域参数将是“人工制品领域”。

构建.xml

最后是构建逻辑本身。

<target name="prepare" description="Generate POM">
    <ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${publish.revision}" status="release"/>
    <ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/donaldduck.pom"/>
</target>

<target name="publish" depends="init,build,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>

笔记:

  • 准备目标使用makepom任务生成 POM。
  • ivy交付任务是可选的,但如果您的 ivy 文件中有任何动态修订(latest.integration、latest.release),建议您执行此任务。
  • 发布目标发布到设置文件中定义的nexus -deploy解析器。
  • ${publish.revision}属性在构建的其他地方设置。我建议阅读有关 ivy 的buildnumber任务

人工制品注意事项

Artifactory 似乎对 ivy 有一些内置支持

于 2011-12-15T21:48:37.067 回答
0

如果您已经打算迁移到 Maven,我建议您查看Aether Ant Tasks,它是旧(现在几乎已弃用)的Maven Ant Tasks的替代品。使用它将公开您的任务所需的所有必需的 Maven 依赖项处理功能。

于 2011-12-14T20:15:36.203 回答