Java Ivy-将解析结果输出到Ivy文件

Java Ivy-将解析结果输出到Ivy文件,java,build,dependencies,ivy,dependency-management,Java,Build,Dependencies,Ivy,Dependency Management,解析完我的ivy.xml文件后,我想创建一个新的resolved ivy.xml文件,其中包含解析中找到的所有可传递依赖项可以这样做吗? 这与deliver不同,deliver(我相信)只从ivy.xml中写出直接依赖项,而不是传递依赖项。Ant任务确实有一个delivertarget属性,在文档中看起来它应该这样做。实际上,它只适用于同一组织中的模块(因此通常不适用于所有依赖项),并为每个模块生成一个文件 它也不同于解析期间生成的ivy报告XML文件,但差别不大。如果我尝试的是不可能的,那么我

解析完我的
ivy.xml
文件后,我想创建一个新的
resolved ivy.xml
文件,其中包含解析中找到的所有可传递依赖项可以这样做吗?

这与deliver不同,deliver(我相信)只从
ivy.xml
中写出直接依赖项,而不是传递依赖项。Ant任务确实有一个
delivertarget
属性,在文档中看起来它应该这样做。实际上,它只适用于同一组织中的模块(因此通常不适用于所有依赖项),并为每个模块生成一个文件

它也不同于解析期间生成的
ivy报告
XML文件,但差别不大。如果我尝试的是不可能的,那么我将直接破解这个文件,我想

此处的上下文试图启用可重复的可复制构建,包括在存储库存在更改(新库、版本)的情况下。互联网上有一些帖子试图做到这一点,但我发现没有一个帖子能做到这一点

  • 添加到Ivy存储库可能会更改解析结果,特别是如果存储库中任何位置(不仅仅是您的项目)的依赖项都具有范围依赖项。示例:
    A
    取决于
    B;[2.0,4.0]
    B;3.1
    稍后添加到存储库中
  • 我们的想法是像平常一样解析,将解析写为一个扁平的常春藤文件,将其保存在项目的VCS中用于该标记(或其他),然后使用
    transitive=“false”
    对该文件进行解析。假设存储库中的现有项不变,则允许重复构建
  • 如果有人有更好的主意做这件事,我洗耳恭听。目前,我希望必须对
    ResolveEngine
    进行一些组合,以使
    ResolveReport
    可用,然后添加一个自定义
    deliveryengine
    来使用它

在正常情况下,我会说这是过火了。您试图解决的问题是您的存储库不可靠。。。。。也许您应该考虑使用存储库管理器来管理您的存储库?

(发布到Maven Central的工件是,这确保了使用存储库的人不会遇到构建不稳定)

话虽如此,如果您不能完全信任存储库模块配置,那么您可以使用ivy任务来尝试执行。它生成一个XML报告,可以使用XSLT将其转换为一个新的ivy文件

例子 编译文件

artifactreport.xsl
artifactreport>可能会有所帮助

使用deliver任务创建一个ivy.xml,其中动态版本约束替换为静态版本约束(即[2.0,3.0]变为2.2.1):


然后使用该文件上的resolve任务准备artifactreport

<ivy:resolve file="${dist.dir}/ivy.xml"
             conf="*(public)"
             refresh="true"
             type="ivy" />

最后,artifactreport将执行瞬态依赖项解析

<ivy:artifactreport tofile="${dist.dir}/artifactreport.xml" />

artifactreport.xml如下所示

<modules>
<module organisation="com.googlecode.flyway" name="flyway" rev="1.7" status="release"/>
<module organisation="org.postgresql" name="postgresql-jdbc" rev="9.0" status="release"/>
<module organisation="org.hibernate" name="hibernate" rev="3.3.2" status="release"/>
<module organisation="org.apache.commons" name="commons-daemon" rev="1.0.2" status="release"/>
...

...

使用XSLT生成ivy.xml表单。

您正在寻找的功能是在ivy 2.4中添加的:。它读取一个
ivy.xml
文件,在本例中用作规范,然后输出一个等效文件,例如
ivy resolved.xml
,并解决了所有可传递的依赖关系。

我不是说更改人工制品,因为正是出于这个原因,我们禁止。我说的是添加到存储库中会影响版本解析。假设我的一个依赖项依赖于CoolLib
[10.0,12.0)
,并且将维护版本11.1添加到存储库中。我不想要我的版本(可能是固定的标记版本)发生这种情况时进行更改,即使新版本显然满足我的约束条件。
artifactreport
可能适用于此;我真的希望不必手动咀嚼常春藤文件。啊,现在我明白了。出于这个原因,我不使用修订范围。偶尔,我会使用“latest.release”之类的动态修订,再加上一个常春藤交付任务,以解决已发布常春藤文件的实际修订。我需要它的时候已经晚了两年,但很高兴看到这个功能现在正确存在。
<ivy:deliver conf="*(public)" deliverpattern="${dist.dir}/ivy.xml"/>
<ivy:resolve file="${dist.dir}/ivy.xml"
             conf="*(public)"
             refresh="true"
             type="ivy" />
<ivy:artifactreport tofile="${dist.dir}/artifactreport.xml" />
<modules>
<module organisation="com.googlecode.flyway" name="flyway" rev="1.7" status="release"/>
<module organisation="org.postgresql" name="postgresql-jdbc" rev="9.0" status="release"/>
<module organisation="org.hibernate" name="hibernate" rev="3.3.2" status="release"/>
<module organisation="org.apache.commons" name="commons-daemon" rev="1.0.2" status="release"/>
...