Java 艾薇:如何出版作品?
我完全不知道ant任务ivy:publish应该如何工作 我希望我进行正常的构建,创建一堆jar文件,然后将这些jar推送到(本地)存储库 我如何指定从何处检索构建的jar,以及这些jar如何在存储库中结束 更新:Java 艾薇:如何出版作品?,java,ant,build-process,build-automation,ivy,Java,Ant,Build Process,Build Automation,Ivy,我完全不知道ant任务ivy:publish应该如何工作 我希望我进行正常的构建,创建一堆jar文件,然后将这些jar推送到(本地)存储库 我如何指定从何处检索构建的jar,以及这些jar如何在存储库中结束 更新: <target name="publish-local" description="--> Publish Local"> <ivy:retrieve /> <ivy:publish resolver="local" pubrevi
<target name="publish-local" description="--> Publish Local">
<ivy:retrieve />
<ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true">
<artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" />
</ivy:publish>
</target>
这实际上是可行的,我以前没有包括检索
但是我仍然有一些问题,假设我想发布3个jar,openscada-utils.jar、openscada-utils-sources.jar和openscada-utils-javadocs.jar,作为openscada-utils-0.9.2.jar、openscada-utils-0.9.2-sources.jar和openscada-utils-0.9.2-javadocs.jar
我并不完全清楚,实际名称是如何组合的,以及在哪里可以指定它们应该获得哪些名称。(使用上面的片段,jar总是只被称为utils.jar)
更新1:
<target name="publish-local" description="--> Publish Local">
<ivy:retrieve />
<ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true">
<artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" />
</ivy:publish>
</target>
我让它工作(有点),但它仍然感觉不对劲。不知何故,所有教程都关注来自第三方项目的依赖关系,但对我来说,同样重要的一点是处理特定于项目的依赖关系
我有一堆子项目,它们以各种方式相互依赖。考虑到常春藤:我不清楚如何开始
<ivy:publish resolver="local" pubrevision="1.0"/>
这是由模式控制的。这很好地涵盖了它。看起来你希望你的是:
<artifacts pattern="${dist.dir}/[organisation]-[module]-[revision]-[type].[ext]" />
您需要在ivy.xml文件中将这三个jar标识为工件。大概是这样的:
<publications>
<artifact name="utils"/>
<artifact name="utils" type="source"/>
<artifact name="utils" type="javadocs"/>
</publications>
了解常春藤在这里做什么很重要。它不仅仅是将您的工件JAR复制到ivy存储库中,它还生成相关的“.ivy.xml”文件,指定每个工件的所有依赖项 在封面下,
ivy:retrieve
任务实际上也触发了ivy:resolve
。当发生ivy:resolve时,会将一个文件写入本地ivy缓存(在user.home
中的.ivy
文件夹中),该文件指定如何进行解析(完成解析需要哪些模块的修订)。当遇到ivy:publish
时,该解析记录从缓存中检索,并用于为工件生成ivy.xml
我发现这样做的最大缺陷是要求ivy:resolve
和ivy:publish
任务在ant执行时都由相同的类加载器加载。确保发生这种情况的最简单方法是在taskdef任务上使用loaderRef。例如(注意匹配的loaderRef标记):
首先需要一个ivy.xml文件
<ivy-module version="2.0">
<info organisation="com.example.code" module="MyProject"
revision="${project.revision}"/>
<configurations>
<conf name="runtime" description="" />
... other config elements here...
</configurations>
<publications defaultconf="runtime">
<artifact name="MyProject" type="jar" ext="jar" conf="runtime" />
</publications>
<dependencies>
...
</dependencies>
</ivy-module>
... 这里的其他配置元素。。。
...
ivy.xml中的info元素和publications元素允许
跳过build.xml中ivy元素的各种属性
注意ivy.xml中的${project.revision}。该属性具有给定值
在build.xml中,但这似乎工作得很好。然后可以修改
轻松获得所需的任何价值(例如,夜间构建与本地构建)
下面是一个如何设置build.xml文件的示例
<property name="project.revision" value="1.0.0"/>
...
<target name="ivy">
<ivy:resolve />
<!-- Possible ivy:report, ivy:retrieve and other
elements for managing your dependencies go here -->
<ivy:deliver conf="*(public)"/>
</target>
<target name="publish" depends="clean, ivy, jar">
<ivy:publish resolver="local">
<!-- possible artifacts elements if your artifacts
are not in standard location -->
</ivy:publish>
</target>
...
...
...
您应该先运行
任务。这将创建一个ivy.xml文件,可供ivy存储库使用
使用
时,通过在解析器
参数中指定要发布到的存储库来指定该存储库。这需要与ivy.settings.xml
文件中的解析器名称匹配
您并没有真正指定工件,而是指定一个模式来查找要发布的工件。您可以通过将其指定为我们的持续构建服务器
我要做的是让开发人员通过
任务从他们的ivy.xml
文件中创建一个pom.xml
文件。这和构建jar/war保存为Jenkins中的归档工件
当我们对某个特定的构建感到满意并希望它出现在我们的公共存储库中时,我使用Jenkin的Promote build任务将带有pom.xml的特定jar/war提升到我们的工件存储库中。我们使用mvn deploy:deploy file
任务来完成此任务。仅供参考,根据deliver
任务由publish
任务调用。
<ivy:publish resolver="public">
<artifacts path="target/archive/[artifact].[ext]"/>
</ivy:publish>