我需要构建一个基于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
,我就不会使用4.3.3版本的Spring,它已经提交给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, common -collections等。
- 创建一个副本dependencies.xml是而不是一个选项
- 我正在考虑通过Ant操纵dependencies.xml,并让它通过regex排除
acme
模块。可行但棘手 - 不幸的是,我不能将Ant任务的
ivy:retrieve
与属性file
和元素exclude
结合起来,因为这将有助于oooooooot
任何想法?
很难理解你的要求。我怀疑你的问题可以通过创建一个额外的配置来解决,并使用配置映射来控制下载。
<标题> 例子这个构建创建了两个目录。第一个包含没有传递依赖的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-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文件的顶部声明的,并且依赖项包含两个配置映射
<标题>额外h1> 面的答案解释了ivy如何解释Maven模块。它创建了可以用来决定应该下载哪些文件的配置:
- maven作用域如何被ivy 映射到ivy配置
好的,看起来替换技巧也很简单。
- 在dependencies.xml文件的部分之间添加以下标记
<!-- DEPS START -->
和<!-- DEPS END -->
(或任何选择)以忽略 -
Hack through Ant
<copy file="dependencies.xml" tofile="ci/hacked-dependencies.xml" overwrite="true"> <filterchain> <replacestring from="<!-- DEPS START -->" to="<!--" /> <replacestring from="<!-- DEPS END -->" to="-->" /> </filterchain> </copy>
<!-- DEPS START -->
<dependency org="com.acme" name="core-platfrom" rev="${version}" transitive="true" conf="runtime->runtime"/>
<!-- DEPS END -->