我们有一个轻微的错综复杂的情况......
在大多数情况下,我们一直在使用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文件为Artifactory指定存储库,并通过Maven设置文件几乎没有成功:
<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发布到版本库的libs-release-local存储库中,则所有内容都会按照您的预期进行解析。此外,如果我将唯一时间戳指定为依赖项版本(SNAPSHOT的替代)的一部分,它也会解析它。所以这表明Maven项目能够解决Artifactory,只是因为SNAPSHOT版本会出现问题。
我在这个问题上几乎没有希望地挖掘高低。如果您能提供任何见解,那将非常感激。
答案 0 :(得分:7)
此处已回答从ivy发布到Nexus存储库的问题:
how to publish 3rdparty artifacts with ivy and nexus
答案可能过于全面。相关部分的标题是“常春藤解决方案”。我在这里总结一下:
您需要一个出版物部分,说明您正在发布一个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>
注意:
我正在使用ibiblio个解析器,并启用了Maven 2兼容性。根据我的经验,这是在常春藤中配置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>
注意:
最后构建逻辑本身。
<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>
注意:
Artifactory似乎有一些built-in support for ivy
答案 1 :(得分:0)
如果您已经要迁移到Maven,我建议您查看Aether Ant Tasks,它们是旧版本的替代版本(现已大幅弃用)Maven Ant Tasks。使用它将公开您的任务所需的所有必需的Maven依赖项处理功能..