0

我想将模块的依赖项与模块的 jar 工件分开发布。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
  <info organisation="com.mycompany" module="platform" />
  <configurations defaultconfmapping="release->*;compile->*" defaultconf="release">
    <conf name="release" />
    <conf name="compile" extends="release" />
  </configurations>
  <publications>
    <artifact name="platform-api" type="jar" ext="jar" />
  </publications>
  <dependencies>
    <dependency org="com.google.inject" name="guice" rev="3.0" />
    <dependency org="org.slf4j" name="slf4j-api" rev="1.6.6" />

    <dependency org="com.google.guava" name="guava" rev="13.0-rc1" conf="compile" />
    <dependency org="log4j" name="log4j" rev="1.2.17" conf="compile" />
    <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.6.6" conf="compile" />
  </dependencies>
</ivy-module>

对于上面的配置,我想要一个只包含 guice 和 slf4j-api jar 的工件,没有 platform-api.jar。我目前的解决方案是在依赖模块中定义两个依赖项,一个是传递的,另一个不是:

<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" conf="myconf->release">
  <exclude org="com.mycompany" />
</dependency>
<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" transitive="false" conf="myotherconf->release" />

但是当第三个模块同时依赖于这两个模块时,这种解决方案会出现问题,而且很丑陋。

4

2 回答 2

5

试试这个:

<ivy-module version="2.0">
  <info organisation="com.mycompany" module="platform" />
  <configurations>
    <conf name="default" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
    <conf name="master"  description="contains only the artifact published by this module itself, with no transitive dependencies"/>
    <conf name="compile" description="Compile dependencies"/>
    <conf name="runtime" description="Runtime dependencies, includes compile dependencies" extends="compile"/>
  </configurations>
  <publications>
    <artifact name="platform-api" type="jar" ext="jar" conf="master"/>
  </publications>
  <dependencies>
    <!-- Compile dependencies -->
    <dependency org="com.google.inject" name="guice" rev="3.0" conf="compile->default"/>
    <dependency org="org.slf4j" name="slf4j-api" rev="1.6.6" conf="compile->default"/>
    <dependency org="com.google.guava" name="guava" rev="13.0-rc1" conf="compile->default" />

    <!-- Runtime dependencies -->
    <dependency org="log4j" name="log4j" rev="1.2.17" conf="runtime->default" />
    <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.6.6" conf="runtime->default" />
  </dependencies>
</ivy-module>

笔记:

  • 请注意配置上的“扩展”属性,用于创建更大的 jar 集。
  • 我建议删除默认配置映射并在每个依赖项上显式设置一个 conf 映射。在我看来更简单,最终更容易理解(不那么神奇)

既然您的模块对已发布的工件及其运行时依赖项具有单独的配置,则可以按如下方式使用单个依赖项声明将它们映射到单独的本地配置:

<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" conf="myconf->runtime;myotherconf->master" />
于 2012-07-30T23:24:42.570 回答
0

我认为,您正在寻找的实际上是两个共享相同依赖项的项目。(巧合的是,其中一个也在使用另一个)。

您是否考虑过使用扩展http://ant.apache.org/ivy/history/latest-milestone/ivyfile/extends.html与:

extendType="dependencies".

然后,您的平台将使用依赖项扩展 parent-ivy.xml。并且您的 Other 项目为相同的依赖项扩展了相同的 parent-ivy.xml 文件。

我不确定这是否足够。由于配置将在这里发挥作用。但也许这是一个开始。

于 2012-07-30T21:54:39.780 回答