使用dependencytree找library相依性
Problem
最近要做log4j的升級,因為有些libraries比較舊,怕會有間接相依的問題,因此想透過dependencytree的功能去找出可能有問題的地方。
How to?
這是我所使用的ivy設定,commons-logging會相依於其它libraries。我在這明確宣告transitive去告訴ivy要去把相依的libraries都抓進來:
<?xml version="1.0" ?> <ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" xmlns:e="http://ant.apache.org/ivy/extra"> <info organisation="org.tonylin.practice" module="IvyAntPractice"> </info> <configurations> <conf name="default" /> </configurations> <dependencies defaultconfmapping="*->default(*)"> <dependency org="commons-lang" name="commons-lang" rev="2.6" transitive="true"/> <dependency org="commons-logging" name="commons-logging" rev="1.1" transitive="true"/> </dependencies> </ivy-module>ant部分直接使用ivy:dependencytree的語法:
<project name="IvyAntPractice" default="init" xmlns:ivy="antlib:org.apache.ivy.ant" > <target name="init"> <ivy:dependencytree transitive="true"/> </target> </project>執行後,就可以在console看到相依性被resolve出來了。沒錯,就是那該死的log4j:
[ivy:dependencytree] Dependency tree for org.tonylin.practice-IvyAntPractice [ivy:dependencytree] +- commons-lang#commons-lang;2.6 [ivy:dependencytree] \- commons-logging#commons-logging;1.1 [ivy:dependencytree] | +- log4j#log4j;1.2.12 [ivy:dependencytree] | +- logkit#logkit;1.0.1 [ivy:dependencytree] | +- avalon-framework#avalon-framework;4.1.3 [ivy:dependencytree] \- javax.servlet#servlet-api;2.3令人傷心的是,如果在ivy.xml設定transitive為false的話,就看不到它相依的內容了。dependencytree的transitive只能控制是否要呈現間接相依的項目出來,resolve還是要依照ivy.xml的內容:
[ivy:dependencytree] Dependency tree for org.tonylin.practice-IvyAntPractice [ivy:dependencytree] +- commons-lang#commons-lang;2.6 [ivy:dependencytree] \- commons-logging#commons-logging;1.1
Reference