我在我的项目中使用 Ivy,但我们使用 Artifactory 作为我们的 jar 存储库。我实际上使用<ivy:makepom>
创建 Maven 的 Ant 任务 pom.xml
,因此我可以通过 Maven deploy:deploy 工作流将 jars 和 wars 部署回我的 Maven 存储库。
我构建了一个名为 common-all.jar
的大 jar 编译需要大约 30 个 jar 。我指定了大约 10 个 jar,Ivy 拉下了依赖项。作为编译过程的一部分,我指定了 log4j jar 和一些 JBoss jar。当然,这些jar 是由我们的环境提供的。
有了这个Jar,我也战了一堆。我指定 common-all.jar
作为我依赖的一部分,以及 common-all.jar
的 30 个 jar 要求也被拉低了。一切都很好。
问题是我何时建立 war 。我不希望 JBoss jar 或 log4j jar 作为 war 的一部分包含在内。这些将由环境提供。我在 pom.xml 文件中将它们标记为已提供。当我构建 common-all.jar
.
现在的问题是,我如何在编译 war 代码时指定我需要这些,但我不想将它们包含在我的 war 本身中。
这是我的 ivy.xml
的示例文件。
我如何指定 common-all.jar
需要某些特定的 jar 进行编译,但是当我在 war 中构建它时,我不想要所有这些 jar
<ivy-module version="1.0">
<info
organisation="com.travelclick"
module="TC-AppUtil"
revision="4.1"
status="release"/>
<configurations>
<conf name="default" visibility="public"
description="The single built artifact. Nothing else"/>
<conf name="compile" visibility="public"
description="The master module and transitive dependencies"/>
<conf name="provided" visibility="public"
description="Needed for compile. Will be provided outside or war"/>
<conf name="runtime" visibility="public"
description="Not required for compile, but for runtime"
extends="compile"/>
<conf name="default" visibility="public"
description="The default configuration"
extends="runtime"/>
<conf name="test" visibility="private"
description="Required for testing" extends="runtime"/>
</configurations>
<dependencies>
<!-- Normal Compile Dependencies -->
<dependency org="ximpleware" name="vtd-xml"
rev="2.5" conf="compile->default"/>
<dependency org="com.travelclick" name="common-all"
rev="4.1" conf="compile->compile,runtime"/>
<!-- Testing -->
<dependency org="junit" name="junit"
rev="4.10" conf="test->default"/>
</dependencies>
</ivy-module>
最佳答案
您还没有演示如何声明 common-all 依赖关系,所以我将编写以下示例:
<dependency org="mygroup" name="common-all" rev="1.0" conf="compile->default;provided"/>
神奇的是配置映射:
- 本地“编译”配置映射到公共(public)模块及其默认(编译)范围依赖项,并且
- 本地“提供”的配置映射到公共(public)模块及其提供的范围依赖项。
在您的构建文件中,配置使用如下:
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="resolve">
<ivy:resolve/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="provided.path" conf="provided"/>
</target>
<target name="compile" depends="resolve">
<javac ...
<classpath>
<path refid="compile.path"/>
<path refid="provide.path"/>
</classpath>
</javac>
</target>
<target name="build" depends="compile">
<ivy:retrieve pattern="build/lib/[artifact].[ext]" conf="runtime"/>
<war ...
<lib dir="build/lib"/>
</war>
</target>
<target name="clean">
<delete dir="build"/>
<ivy:cleancache/>
</target>
</project>
关于Ivy/Maven 解决 : Don't pull transitive "provided" jars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586945/