我刚刚开始使用Ivy,我真的很挣扎,因为我发现Apache网站上的文档和教程非常令人困惑,与我想如何使用它无关。
我想使用Ant将一些jar文件发布到本地Ivy存储库。Ant脚本创建了四个jar文件:
- sed-ws-client.jar
- sed-ws-client-src.jar
- sed-enums.jar
- sed-enums-src.jar
这些jar应该在Ivy存储库的两个不同目录中结束(例如,sed-ws-client
目录和sed-enums
目录)。存储库目前在适当的目录中包含这些jar的0.0.1和0.0.2版本,以及相应的ivy-[version].xml文件(这是手动完成的)。
我有很多麻烦弄清楚如何构建"发布"Ant目标和项目的ivy.xml
文件。我被迫将模块名称放在ivy.xml
文件的info
标记中,但这意味着我只能将jar发布到Ivy存储库中的一个目录?
我尝试了各种各样的东西,但Ant构建总是失败。我只是想要一个简单的解释,我需要采取的步骤,使它工作。如果需要,可以更改存储库结构。
到目前为止我写的是:
ivy.xml
file:
<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>
我用两个ivy文件解决了这个问题,因为我的项目发布了2个模块。每个模块都需要自己的ivy.xml。这是第二个模块的目标,它有自己的ivy文件(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>
您的工件如何存储在存储库中是无关紧要的。Ivy根据模块和工件名称查找工件。通常,您应该将一个项目视为一个Ivy模块。如果您的项目产生两个模块,最好的方法是将这个项目分成两个。模块是逻辑上一致的工件集合,一起更改。
构建失败,因为发布任务找不到要发布的构件。例如,在这个发布任务中:
<ivy:publish resolver="${ivy.repository}" update="true" overwrite="true">
<artifacts pattern="${artifacts.dir}/[artifact].[ext]"/>
</ivy:publish>
我们告诉Ivy从${artifacts中获取具有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>