Java 艾薇:如何出版作品?

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

我完全不知道ant任务ivy:publish应该如何工作

我希望我进行正常的构建,创建一堆jar文件,然后将这些jar推送到(本地)存储库

我如何指定从何处检索构建的jar,以及这些jar如何在存储库中结束

更新:

<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>
我让它工作(有点),但它仍然感觉不对劲。不知何故,所有教程都关注来自第三方项目的依赖关系,但对我来说,同样重要的一点是处理特定于项目的依赖关系

我有一堆子项目,它们以各种方式相互依赖。考虑到常春藤:我不清楚如何开始

  • 如何处理第一个版本?我对所有子项目都有一个通用的版本号,以表明它们属于同一个项目(比如说0.9)。因此,第一个版本应该是0.9.0,但到目前为止,我的项目都没有在我的存储库中。如何让Ivy分配此修订号

  • 在开发过程中,我想再次发布构建的文件,而不改变修订号

  • 如果我完成了我的工作,我想将其推送到共享存储库(并将修订号从0.9.0增加到0.9.1),建议采用什么方法

  • 对于一个实际的发行版,我想发行有依赖关系的发行版和没有依赖关系的发行版,我想我可以使用不同的配置。我怎样才能利用这个优势呢

  • 您需要指定“解析器”。比如:

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