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
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"/>
...