CLOVER🍀

That was when it all began.

Mavenでプロジェクトの依存関係を解析する

できるできるとは聞いたことがありましたが、実際にコマンドを打ったことがなかったので試してみました。

dependency:tree
http://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html

例えば、こんなpom.xmlを用意します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>myapp.hello</groupId>
  <artifactId>myapp-hello</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>myapp-hello</name>

  <repositories>
    <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>http://maven.seasar.org/maven2</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>http://maven.seasar.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <dependency>
      <groupId>org.seasar.container</groupId>
      <artifactId>s2-framework</artifactId>
      <version>2.4.46</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.1</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>HelloWorld</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

これに対して、以下のコマンドを実行すると

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp-hello 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ myapp-hello ---
[INFO] myapp.hello:myapp-hello:jar:0.0.1-SNAPSHOT
[INFO] +- org.seasar.container:s2-framework:jar:2.4.46:compile
[INFO] |  +- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  +- jboss:javassist:jar:3.4.ga:compile
[INFO] |  +- ognl:ognl:jar:2.6.9-patch-20090427:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.1:compile
[INFO] |  \- junit:junit:jar:3.8.2:compile
[INFO] \- org.apache.commons:commons-lang3:jar:3.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.142s
[INFO] Finished at: Thu Dec 06 23:47:01 JST 2012
[INFO] Final Memory: 9M/105M
[INFO] ------------------------------------------------------------------------

プロジェクトのライブラリへの依存関係を、その先のライブラリへの依存関係を含めてツリー表示してくれます。

ちなみに、ツリーの部分だけ別ファイルに出したい場合は、以下のように指定すればいいようです。

$ mvn dependency:tree -DoutputFile=dependency.txt
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp-hello 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ myapp-hello ---
[INFO] Wrote dependency tree to: /xxxxx/maven-dependency/dependency.txt
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.256s
[INFO] Finished at: Thu Dec 06 23:50:19 JST 2012
[INFO] Final Memory: 9M/105M
[INFO] ------------------------------------------------------------------------

内容は、こんな感じ。

$ cat dependency.txt 
myapp.hello:myapp-hello:jar:0.0.1-SNAPSHOT
+- org.seasar.container:s2-framework:jar:2.4.46:compile
|  +- aopalliance:aopalliance:jar:1.0:compile
|  +- jboss:javassist:jar:3.4.ga:compile
|  +- ognl:ognl:jar:2.6.9-patch-20090427:compile
|  +- commons-logging:commons-logging:jar:1.1:compile
|  \- junit:junit:jar:3.8.2:compile
\- org.apache.commons:commons-lang3:jar:3.1:compile

その他、ツリー表示するスコープを絞ったりもできるようですよ。詳しくは、ドキュメントを…。