有条件地排除常春藤依赖

时间:2016-09-28 14:13:23

标签: java ant ivy

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

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

我们典型的dependencies.xml文件包含对 模块的依赖关系。 其他潜在的依赖关系。作为一个例子,我们的核心模块依赖于许多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的依赖关系,我将不会采用已经提交给Git的Spring的4.3.3,并且可以在core-platform当前构建的{{1}中使用}。我希望我的解释很容易理解。

所以让我说我有这个依赖列表作为例子

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

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

  1. 创建重复的dependencies.xml是选项
  2. 我正在考虑通过Ant操纵dependencies.xml并让它通过regex排除<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> 模块。
  3. 可行但很棘手
  4. 很遗憾,我无法将Ant任务的acme与属性ivy:retrieve和元素file结合起来,因为这样可以帮助实现looooooot
  5. 有什么想法吗?

2 个答案:

答案 0 :(得分: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

的build.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>

注意:

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

的其他

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

答案 1 :(得分:-1)

好的,看起来替换技巧也很容易。

  1. 在dependencies.xml文件的部分之间添加以下标记<!-- DEPS START --><!-- DEPS END -->(或任何选择)以忽略
  2. Hack via 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>
    
  3. 实施例

        <!-- DEPS START --> 
        <dependency org="com.acme" name="core-platfrom" rev="${version}" transitive="true" conf="runtime->runtime"/>
        <!-- DEPS END -->