はじめに

Mavenのセントラルリポジトリに登録されていないライブラリ(Oracleのojdbc.jarや自作Jar)をpom.xmlで指定できるようにする方法を書く。
方法はローカルリポジトリにインストールすることになるのだが、その方法を二点記載する。またあるサイトでsystemスコープを指定することで簡単に実現できると書いてあったが、2016/08/21時点では、mvn installするとWARNINGが発生してライブラリが最終成果物のJarファイルに含まれないという事態に陥ったので、その点も記載する。

ローカルリポジトリにインストールする方法その1

  1. Mavenのinstallコマンドを実行する

    カレントディレクトリにインストールしたいライブラリがあるとする。ojdc6.jarや自作ライブラリmy_common.jarを mvn install:install-file して、ローカルリポジトリにインストールするには、次のコマンド実行方法の通りにする。

    # コマンド実行方法
    # mvn install:install-file -Dfile=Jarファイルへのパス -DgroupId=グループID -DartifactId=アーティファクトID -Dversion=バージョン -Dpackaging=jar
    # ojdbc6.jarの場合
    mvn install:install-file -Dfile=ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
    # 自作ライブラリの場合
    mvn install:install-file -Dfile=my_common.jar -DgroupId=me -DartifactId=my_common -Dversion=1.0.0 -Dpackaging=jar

    参考:Guide to installing 3rd party JARs

  2. プロダクトのpom.xmlでライブラリを指定する。

    # ojdbc6.jarの場合
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0</version>
    </dependency>
  3. 確認

    ライブラリのリンク先を確認する。
    Eclipseを使っていれば、Maven Dependenciesのojdbc6.jarが.m2\repository\com\oracle\ojdbc6\11.2.0となっている。
    実際に.m2\repository\com\oracle\ojdbc6の中を見てみると、maven-metadata-local.xmlが出力され、さらに11.2.0の中には、Jarファイルやpomファイルが入っている。

systemスコープを指定する方法とその問題点

Mavenリポジトリで提供されていないサードパーティJarをどうするかに書いてあった方法で、一番簡潔でいいかと思われたが、mvn install時に問題が発生した。最終成果物のJarファイルに今回追加したいライブラリが含まれないのだ。
Mavenリポジトリで提供されていないサードパーティJarをどうするかで示されている方法を今回の例に合わせて記載したうえで、問題点を見ていく。

  1. プロダクトのpom.xmlに<scope><systemPath>をつけて書く

    # ojdbc6.jarの場合
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0</version>
      <scope>system</scope>
      <systemPath>${basedir}/lib/ojdbc6.jar</systemPath>
    </dependency>

    <scope>ではsystemを指定し、<systemPath>ではpom.xmlが置かれているディレクトリまでのフルパスを示す${basedir}を用いてライブラリのフルパスを指定する。

  2. 確認

    ライブラリのリンク先を確認する。
    Eclipseを使っていれば、Maven Dependenciesのojdbc6.jarが.workspace\プロダクト名\libになっている。

  3. 問題点

    Eclipse上では問題なく開発ができるようになった。開発に区切りがつき、Jarファイルにまとめてサーバで実行しようとmvn installコマンドを打つと次のWARNINGが発生する。

    [WARNING] 'dependencies.dependency.systemPath' for com.oracle:ojdbc6:jar should not point at files within the project directory, ${basedir}/lib/ojdbc6.jar will be unresolvable by dependent projects @ line 79, column 16
    [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
    [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

    WARNINGがでてもビルド自体は成功し、BUILD SUCCESSと出力される。しかし、生成されたJarファイルを解凍してみるとojdbc6.jarは含まれていなかった。
    <systemPath>を使い、サードパーティ製Jarファイルを指定すべきではないようだ。

ローカルリポジトリにインストールする方法その2

ローカルリポジトリへのインストールを採用する場合は長いmvn install:install-fileコマンドを打たないといけないのに対して、systemスコープを指定する場合はバージョン管理システムからEclipseにImportするだけでよく、シンプルだと思ったが、mvn installできないので採用するわけにはいかない。しかし${basedir}を用いてライブラリのフルパスをpom.xmlに書くという点は、ローカルリポジトリへのインストールにも応用でき、長いmvn install:install-fileコマンドを打たなくてもmvn cleanだけで良くなる。

  1. プロダクトのpom.xmlでライブラリを指定する

    # ojdbc6.jarの場合
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0</version>
    </dependency>
  2. プロダクトのpom.xmlでmaven-install-pluginを設定する。

    mvn install:install-fileで書いたことと同じことをpom.xmlで書いているだけである。コマンド引数を全てpom.xmlに書くことで毎回コマンドを打たなくて良くなる。

    <build>
     <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-install-plugin</artifactId>
             <executions>
                 <execution>
                     <id>install-external</id>
                     <phase>clean</phase>
                     <configuration>
                         <file>${basedir}/lib/ojdbc6.jar</file>
                         <repositoryLayout>default</repositoryLayout>
                         <groupId>com.oracle</groupId>
                         <artifactId>ojdbc6</artifactId>
                         <version>11.2.0</version>
                         <packaging>jar</packaging>
                         <generatePom>true</generatePom>
                     </configuration>
                     <goals>
                         <goal>install-file</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
     </plugins>
    </build>

    参考:Maven and adding JARs to system scope

  3. mvn cleanコマンドを実行する

    maven-install-pluginの設定で<phase>clean</phase>と設定したため、mvn cleanを実行することで、maven-install-pluginが動いてくれる。

  4. 確認

    Eclipse 4.6 Neonで確認した限りでは、mvn cleanを実行した後もpom.xmlにはMissing artifact com.oracle:ojdbc6:jar:11.2.0というエラーが出ていた。これはコマンドラインでmvn cleanしてもEclipseのRun AsからMaven Cleanを選んでも同じ。
    pom.xmlを再保存するとエラーは消えた。
    ローカルリポジトリにインストールする方法その1と同様、Eclipseを使っていれば、Maven Dependenciesのojdbc6.jarが.m2\repository\com\oracle\ojdbc6\11.2.0となっている。
    実際に.m2\repository\com\oracle\ojdbc6の中を見てみると、maven-metadata-local.xmlが出力され、さらに11.2.0の中には、Jarファイルやpomファイルが入っている。
    またmvn installやmvn packageを行っても生成されたJarファイルにはojdbc6.jarが入っていた。

まとめ

ローカルリポジトリにインストールする方法であれば、どちらの方法を採用しても問題ないが、pom.xmlにmvn install:install-fileの引数情報が全てつまっている方法2の方がお勧め。