2012-07-30 125 views
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> 

对于上述结构,我想包括吉斯仅& SLF4J-API罐子,而平台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" /> 

但这种方法会导致问题,当第三个模块是依赖于这两个模块,它只是丑陋。

回答

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> 

注:

  • 注意 “伸出” 上的配置,用于创建更大的套瓶的属性。
  • 我建议删除默认配置映射,并明确设置每个依赖关系的conf映射。简化和最终更容易在我看来,了解(减少魔法)

现在你的模块有不同的配置,为发布的文物,它的运行时依赖单一的依赖性声明中可以按如下方式映射这些分离的本地配置使用:

<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" conf="myconf->runtime;myotherconf->master" /> 
+0

谢谢!上面的用法是一本教科书质量的例子,它丰富了我的视野,并为第三个模块提出了一个解决方案。 – b10y 2012-07-31 14:39:08

0

我想,你在找什么实际上是两个项目共享相同的依赖关系。 (巧合的是其中一个人也在使用另一个)。

你有没有考虑使用扩展http://ant.apache.org/ivy/history/latest-milestone/ivyfile/extends.html有:

extendType="dependencies". 

然后,你将不得不延长了家长的ivy.xml与依赖平台。而您的其他项目为相同的依赖项扩展相同的parent-ivy.xml文件。

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