CLOVER🍀

That was when it all began.

Mavenでプロジェクト内で使用していないライブラリを調べる

これも同じく、使ったことのないプラグイン(ゴール)です。

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

pom.xmlに依存関係が定義してある割には、実際のコードで使っていないと思われる依存関係を解析してくれます。

こんな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>

Javaソースがこんな感じだった場合…
src/main/java/HelloWorld.java

import org.seasar.framework.util.StringUtil;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(StringUtil.isEmpty(""));
    }
}

analyzeを行うと、以下のような結果になります。

$ mvn dependency:analyze
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp-hello 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-dependency-plugin:2.1:analyze (default-cli) @ myapp-hello >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ myapp-hello ---
[debug] execute contextualize
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /xxxxx/maven-dependency/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ myapp-hello ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ myapp-hello ---
[debug] execute contextualize
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /xxxxx/maven-dependency/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ myapp-hello ---
[INFO] No sources to compile
[INFO] 
[INFO] <<< maven-dependency-plugin:2.1:analyze (default-cli) @ myapp-hello <<<
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:analyze (default-cli) @ myapp-hello ---
[WARNING] Unused declared dependencies found:
[WARNING]    org.apache.commons:commons-lang3:jar:3.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.718s
[INFO] Finished at: Thu Dec 06 23:55:24 JST 2012
[INFO] Final Memory: 11M/171M
[INFO] ------------------------------------------------------------------------

ちょっとわかりにくいですが、よーく見ると

[WARNING] Unused declared dependencies found:
[WARNING]    org.apache.commons:commons-lang3:jar:3.1:compile

commons-lang3を使ってないよ!と警告されています。

当然のことながら、Class#forNameとかで動的に依存している場合にはMavenに使っているいることに気付いてもらえません…。