2012-07-30 120 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文件。

我不確定這是否足夠。由於配置將在這裏發揮作用。但也許這是一個開始。