有条件地排除 Ivy 依赖项

问题描述 投票:0回答:2

我需要构建一个自定义 Ant 脚本,用于构建基于 CI 输出的项目。我们使用 Atlassian Bamboo 作为 CI 服务器。

通常我们的项目依赖于我们的平台模块,通过 Ivy/Artifactory 进行管理。

我们典型的

dependencies.xml
文件包含对 that 模块的依赖关系,传递性。 以及其他潜在的依赖项。举个例子,我们的核心模块依赖于很多 Spring 包,但不依赖于 Spring Boot。如果项目也需要 Spring Boot,它将在其
dependencies.xml
文件中定义其依赖项以及
<depencency org="com.acme" name="core-platform"...

我现在的目标是从解析中排除

com.acme#core-platform
,因为我正在执行一项不同的任务,使用 Bamboo 输出工件来获取核心模块及其依赖项的最新版本,无需通过 Artifactory。

这非常重要,因为在构建过程中我可能想更改依赖包的版本(例如将 Spring 4.3.1 升级到 4.3.3)并使用正确的 Spring 进行测试。如果我只是将依赖关系解析为在 Artifactory 上发布的

com.acme#core-platform#latest.release
,我将不会采用 Spring 4.3.3,该版本已提交给 Git,并可在
core-platform
当前构建的
dependencies.xml
中使用。

假设我有这个依赖项列表作为示例

    com.acme#core-platform#${version}
    org.hibernate#hibernate-java8#5.1.0.Final
    org.springframework.boot#spring-boot-starter-web#1.3.1.RELEASE
    commons-collections#commons-collections#3.2.2
    .... others

完全依赖是

<dependencies>  
    <dependency org="com.acme"              name="core-platform"          rev="${version}"         transitive="true"      conf="runtime->runtime" changing="true"/>
    <dependency org="com.acme"              name="core-platform"          rev="${version}"         transitive="true"      conf="compile->compile" changing="true"/>
    <dependency org="com.acme"              name="core-platform"          rev="${version}"         transitive="true"      conf="provided->provided" changing="true"/>
    <dependency org="com.acme"              name="core-platform"          rev="${version}"         transitive="true"      conf="junit->junit" changing="true"/>
    <dependency org="com.acme"              name="core-platform"          rev="${version}"         transitive="true"      conf="test->test" changing="true"/>

 
    
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-java8 -->
    <dependency org="org.hibernate" name="hibernate-java8" rev="5.1.0.Final" transitive="false" />
    
    
    <dependency org="org.springframework.boot"  name="spring-boot-starter-web"          rev="1.3.1.RELEASE"                 transitive="false" />
    <dependency org="org.springframework.boot"  name="spring-boot-starter-tomcat"       rev="1.3.1.RELEASE"                 transitive="false" />
    <dependency org="org.springframework.boot"  name="spring-boot-starter-validation"   rev="1.3.1.RELEASE"                 transitive="false" />
    
    
    <dependency org="commons-collections"               name="commons-collections"              rev="3.2.2"             transitive="false" />
    
    
    <!-- jackson2 libs -->
    <dependency org="com.fasterxml.jackson.datatype"    name="jackson-datatype-jdk8"            rev="2.8.1"             transitive="false"          conf="runtime->*"/>
    <dependency org="com.fasterxml.jackson.datatype"    name="jackson-datatype-jsr310"          rev="2.8.1"             transitive="false"          conf="runtime->*"/>
    
    
    <exclude module="joda-time" />
    <exclude module="jackson-datatype-joda" />
</dependencies>

我只是想采用 Hibernates 的 Java8、commons-collections 等。

  1. 创建重复的 dependency.xml 不是一个选项
  2. 我正在考虑通过 Ant 操作 dependency.xml 并让它通过正则表达式排除
    acme
    模块。可行但棘手
  3. 不幸的是,我无法将 Ant 任务的
    ivy:retrieve
    与属性
    file
    和元素
    exclude
    结合起来,因为这会帮助 looooooot

有什么想法吗?

java ant ivy
2个回答
1
投票

很难理解您的需求。我怀疑您的问题可以通过创建额外的配置并使用配置映射来控制下载来解决。

示例

此构建创建了两个目录。第一个包含没有传递依赖的 log4j 依赖,第二个包含远程模块的可选依赖。如果您查看远程 POM,您会发现它们具有不同的范围。

├── build.xml
├── ivy.xml
├── lib1
│   └── log4j-1.2.17.jar
└── lib2
    ├── activation-1.1.jar
    ├── geronimo-jms_1.1_spec-1.0.jar
    ├── log4j-1.2.17.jar
    └── mail-1.4.3.jar

构建.xml

<project name="demo" default="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">

  <target name="resolve">
    <ivy:resolve/>

    <ivy:retrieve pattern="lib1/[artifact]-[revision](-[classifier]).[ext]" conf="noDependencies"/>
    <ivy:retrieve pattern="lib2/[artifact]-[revision](-[classifier]).[ext]" conf="withDependencies"/>
  </target>

</project>

备注:

  • 每个“检索”任务都会创建一个目录,其中包含构成配置的文件。

ivy.xml

<ivy-module version="2.0">
  <info organisation="com.myspotontheweb" module="demo"/>

  <configurations>
    <conf name="noDependencies" description="File grouping that has no transitive dependencies"/>
    <conf name="withDependencies" description="File grouping that contains dependencies"/>
  </configurations>

  <dependencies>
    <dependency org="log4j" name="log4j" rev="1.2.17" conf="noDependencies->master; withDependencies->master,optional"/>
  </dependencies>

</ivy-module>

备注:

  • 注意配置是如何在ivy文件顶部声明的,并且依赖项包含两个配置映射

额外

以下答案解释了ivy如何解释Maven模块。它创建可用于决定应下载哪些文件的配置:


-1
投票

好吧,看起来替换技巧也很简单。

  1. 在要忽略的 dependency.xml 文件的各个部分之间添加以下标记
    <!-- DEPS START -->
    <!-- DEPS END -->
    (或任何选择)
  2. 通过 Ant 进行黑客攻击

    <copy file="dependencies.xml" tofile="ci/hacked-dependencies.xml" overwrite="true">
        <filterchain>
            <replacestring from="&lt;!-- DEPS START --&gt;" to="&lt;!--" />
            <replacestring from="&lt;!-- DEPS END --&gt;" to="--&gt;" />
        </filterchain>
    </copy>
    

示例

    <!-- DEPS START --> 
    <dependency org="com.acme" name="core-platfrom" rev="${version}" transitive="true" conf="runtime->runtime"/>
    <!-- DEPS END -->
© www.soinside.com 2019 - 2024. All rights reserved.