Maven の jar の依存関係のリストを作る。
どうも!Apache ManifoldCF で Amazon CloudSearch のコネクターを作っているのですが、先日記事にしたテキスト展開ライブラリの Apache Tika を組み込むにあたって、依存する jar ファイルの一覧を作る必要がでてきました。というわけで、今日は Maven から、依存する jar の一覧の取り方について。(そっ閉じメソッドw)
実は、Apache ManifoldCF のビルドシステムがあまりイケてなくて、必要なライブラリを全部 build.xml に書く必要があります。Maven なら、tika-parser と書いておけば、ぶら下がる jar を一式取ってきてくれるのですが。。。これは愚痴です。なぜ愚痴ってるのかというと、Tika はその性質上、ファイルの種類ごとにファイルを読むためのライブラリを使用して、テキストを展開しており、このため、必要な jar がやたらと多いのです。おおメンドクセーーー。
はじめは、Maven Repository*1を見てリストすればいいかー、と気軽に思っていたのですが、依存の依存もあり、依存関係のツリーを掘るとかなり難儀しそうだったので、コマンドを探すことにしました。
それが以下のコマンド。めっちゃ簡単。ちなみに、上下関係はイランという方は、dependency:list でどうぞ。
mvn dependency:tree
コマンドの結果のみ抽出すると以下になります。-Dfileoutput オプションを渡すと、ファイルにも出力可能です。
[INFO] yoshida:tika-sample:jar:0.0.1-SNAPSHOT [INFO] +- org.apache.tika:tika-core:jar:1.5:compile [INFO] +- org.apache.tika:tika-parsers:jar:1.5:compile [INFO] | +- org.gagravarr:vorbis-java-tika:jar:0.1:compile [INFO] | | \- org.gagravarr:vorbis-java-core:jar:tests:0.1:test,provided [INFO] | +- edu.ucar:netcdf:jar:4.2-min:compile [INFO] | | \- org.slf4j:slf4j-api:jar:1.5.6:compile [INFO] | +- org.apache.james:apache-mime4j-core:jar:0.7.2:compile [INFO] | +- org.apache.james:apache-mime4j-dom:jar:0.7.2:compile [INFO] | +- org.apache.commons:commons-compress:jar:1.5:compile [INFO] | | \- org.tukaani:xz:jar:1.2:compile [INFO] | +- commons-codec:commons-codec:jar:1.5:compile [INFO] | +- org.apache.pdfbox:pdfbox:jar:1.8.4:compile [INFO] | | +- org.apache.pdfbox:fontbox:jar:1.8.4:compile [INFO] | | +- org.apache.pdfbox:jempbox:jar:1.8.4:compile [INFO] | | \- commons-logging:commons-logging:jar:1.1.1:compile [INFO] | +- org.bouncycastle:bcmail-jdk15:jar:1.45:compile [INFO] | +- org.bouncycastle:bcprov-jdk15:jar:1.45:compile [INFO] | +- org.apache.poi:poi:jar:3.10-beta2:compile [INFO] | +- org.apache.poi:poi-scratchpad:jar:3.10-beta2:compile [INFO] | +- org.apache.poi:poi-ooxml:jar:3.10-beta2:compile [INFO] | | +- org.apache.poi:poi-ooxml-schemas:jar:3.10-beta2:compile [INFO] | | | \- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile [INFO] | | \- dom4j:dom4j:jar:1.6.1:compile [INFO] | +- org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:jar:1.0.1:compile [INFO] | +- org.ccil.cowan.tagsoup:tagsoup:jar:1.2.1:compile [INFO] | +- org.ow2.asm:asm-debug-all:jar:4.1:compile [INFO] | +- com.googlecode.mp4parser:isoparser:jar:1.0-RC-1:compile [INFO] | | \- org.aspectj:aspectjrt:jar:1.6.11:compile [INFO] | +- com.drewnoakes:metadata-extractor:jar:2.6.2:compile [INFO] | | +- com.adobe.xmp:xmpcore:jar:5.1.2:compile [INFO] | | \- xerces:xercesImpl:jar:2.8.1:compile [INFO] | | \- xml-apis:xml-apis:jar:1.3.03:compile [INFO] | +- de.l3s.boilerpipe:boilerpipe:jar:1.1.0:compile [INFO] | +- rome:rome:jar:0.9:compile [INFO] | | \- jdom:jdom:jar:1.0:compile [INFO] | +- org.gagravarr:vorbis-java-core:jar:0.1:compile [INFO] | +- com.googlecode.juniversalchardet:juniversalchardet:jar:1.0.3:compile [INFO] | \- com.uwyn:jhighlight:jar:1.0:compile [INFO] \- junit:junit:jar:3.8.1:test
ところが、Maven Repositoryと見比べてみると、PDFBox の依存関係に差異があることに気が付きました。icu4j が、上記の tree の結果に含まれていません。
そこで、直接 pdfbox の pom.xml を確認してみる。optional になっていることがわかりました。元の pom.xml optional が false なので dependency:tree しても表示されないと、そういうことでした。Maven Repository の書き漏らしではありませんw
以下は、PDFBox の pom.xml の該当箇所。
http://repo1.maven.org/maven2/org/apache/pdfbox/pdfbox/1.8.4/pdfbox-1.8.4.pom
<dependencies> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>jempbox</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcmail-jdk15</artifactId> <version>1.44</version> <optional>true</optional> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>1.44</version> <optional>true</optional> </dependency> <dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>3.8</version> <optional>true</optional> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies>
これでリストが作れるぞー! *2
*2:Gradle使おうぜ、Gradle。。