HBase のクライアント機能向けにmavenの依存関係を設定する。

この記事の方法でhbase.jarをローカルリポジトリに登録して、Webアプリケーションにhbase.jarへの依存関係を設定したところ、ビルドを壊してしまいました。わーい。WEB-INF/lib にservlet-api.jar や jsp などを断りもなく突っ込んでしまうから、もうなんか。。

hbaseをダウンロードしたときについてくるpom.xmlは、hbaseサーバ機能が依存するjarがこれでもかと設定されているので、クライアントとしてのみ、利用するには不向きです。で、以下のマニュアルページを確認したところ、

http://hbase.apache.org/client_dependencies.html

最低限必要なのは hbase, hadoop, guava, and zookeeperのjar です

なるほど、ということで、hbaseの登録用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>

  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>8</version>
  </parent>

  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase</artifactId>
  <packaging>jar</packaging>
  <version>0.90.0-client</version>
  <name>HBase</name>
  <description>
    HBase is the &amp;lt;a href="http://hadoop.apache.org"&amp;rt;Hadoop&lt;/a&amp;rt; database. Use it when you need
    random, realtime read/write access to your Big Data.
    This jar is configured to use for hbase client application.
  </description>
  <url>http://hbase.apache.org</url>

  <repositories>
   <repository>
      <id>temp-thrift</id>
      <name>Thrift 0.2.0</name>
      <url>http://people.apache.org/~rawson/repo/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository> 
    <repository>
      <id>java.net</id>
      <name>Java.Net</name>
      <url>http://download.java.net/maven/2/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
    <repository>
      <id>codehaus</id>
      <name>Codehaus Public</name>
      <url>http://repository.codehaus.org/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
  </repositories>

  <properties>
    <compileSource>1.6</compileSource>

    <!-- Dependencies -->
    <guava.version>r06</guava.version>
    <!--The below was made by patching branch-0.20-append
    at revision 1034499 with this hdfs-895 patch:
    https://issues.apache.org/jira/secure/attachment/12459473/hdfs-895-branch-20-append.txt
    -->
    <hadoop.version>0.20-append-r1056497</hadoop.version>
    <junit.version>4.8.1</junit.version>
    <log4j.version>1.2.16</log4j.version>
    <mockito-all.version>1.8.5</mockito-all.version>
    <protobuf.version>2.3.0</protobuf.version>
    <slf4j.version>1.5.8</slf4j.version><!-- newer version available -->
    <stax-api.version>1.0.1</stax-api.version>
    <zookeeper.version>3.3.2</zookeeper.version>
  </properties>

  <!-- Sorted by groups of dependencies then groupId and artifactId -->
  <dependencies>
    <!-- General dependencies -->
       <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>${guava.version}</version>
    </dependency>
    
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>${hadoop.version}</version>
	<exclusions>
		<exclusion>
			<groupId>commons-cli</groupId>
			<artifactId>commons-cli</artifactId>
		</exclusion>
		<exclusion>
			<groupId>xmlenc</groupId>
			<artifactId>xmlenc</artifactId>
		</exclusion>
		<exclusion>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
		</exclusion>
		<exclusion>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
		</exclusion>
		<exclusion>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty-util</artifactId>
		</exclusion>
		<exclusion>
			<groupId>tomcat</groupId>
			<artifactId>jasper-runtime</artifactId>
		</exclusion>
		<exclusion>
			<groupId>tomcat</groupId>
			<artifactId>jasper-compiler</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jsp-api-2.1</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jsp-2.1</artifactId>
		</exclusion>
		<exclusion>
			<groupId>commons-el</groupId>
			<artifactId>commons-el</artifactId>
		</exclusion>
		<exclusion>
			<groupId>net.java.dev.jets3t</groupId>
			<artifactId>jets3t</artifactId>
		</exclusion>
		<exclusion>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>servlet-api-2.5</artifactId>
		</exclusion>
		<exclusion>
			<groupId>net.sf.kosmosfs</groupId>
			<artifactId>kfs</artifactId>
		</exclusion>
		<exclusion>
			<groupId>hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
		</exclusion>
		<exclusion>
			<groupId>oro</groupId>
			<artifactId>oro</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.eclipse.jdt</groupId>
			<artifactId>core</artifactId>
		</exclusion>
	</exclusions>

    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>${zookeeper.version}</version>
    </dependency>

    <!-- Test dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>${mockito-all.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-math</artifactId>
      <version>${commons-math.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-test</artifactId>
      <version>${hadoop.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

</project>

クライアント利用の依存関係しか設定していないことがわかるように、バージョンを変えましたが、jarは同じです。

こういうのを経験すると、

  • jarは利用シーンを考慮してパッケージングするべき。少なくともサーバ機能とクライアント機能は別にしてほしい。
  • jarの依存関係はなるべく少なくするようにパッケージングするべき

と思います。気をつけよう。(だって、デフォルトのpom.xmlを使うと、antのバージョン違いが2つクラスパスに入り込んで、それはもうjar祭りになっていましたので)。