Tech

パッケージ管理ソフトのローカルリポジトリの使い方

TL;DR

  • パッケージ管理ソフトのリモートリポジトリとローカルリポジトリについて
  • 特にローカルリポジトリの役割について
  • Mavenのローカルリポジトリに自身で作成したライブラリを追加する方法

パッケージ管理ソフト

開発者を楽にしてあげようと、日夜各言語のエキスパートたちが便利なプログラム集を開発しています。

それがライブラリであり、せっかく開発した便利なものを世界の開発者に自由にインストールして使ってもらうために存在しているのがパッケージ管理ソフトです。

またそれ以外の役割として、

  • ライブラリのバージョン管理
  • 依存関係の解決

これらの問題も解決してくれます。

パッケージ管理ソフトは言語ごとに種類があり、yum,npm,composer,maven,pip,RubyGemsなどがあります。

ところで、みなさんは「ライブラリをインストールする」と言ってパッケージ管理ソフトのコマンドを叩くことがあると思います。

しかし、そのライブラリというのはどこからインストールされているのでしょうか?

よく考えると不思議なことですよね。

コマンドを叩くだけで便利なプログラムの集まりが自分のマシンのローカル環境へインストールされてくるわけです。

この答えを考えるためには、パッケージを管理するリポジトリについて知る必要があります。

リポジトリ

Gitなどでお馴染みの概念かと思います。

リポジトリは日本語だと貯蔵庫という意味ですね。

文字通りプログラムを貯蔵しておく場所というわけです。

さて、ここでお察しの方も多いと思います。

パッケージ管理ツールでコマンドを叩いた場合、基本的にはこのリポジトリからライブラリをインストールしているというわけです。

そんなリポジトリには種類があります。

  • リモートリポジトリ
  • ローカルリポジトリ

先ほど「パッケージ管理ツールでコマンドを叩いた場合、基本的にはこのリポジトリからライブラリをインストールしている」と言いましたが、これは厳密には正解ではありません。

より正確に言うと、各パッケージ管理ソフトは"セントラルリポジトリ"というそのパッケージ管理ソフトがデフォルトで参照するリモートリポジトリからライブラリをインストールしています。

つまりセントラルリポジトリは、リモートリポジトリの一種というわけです。

このリポジトリの種類というのは場所という要素で区別されています。

なので、インターネット上であなた自身がなんらかの言語のライブラリをセントラルリポジトリ以外で公開したとなれば、それはリモートリポジトリとなるわけです。

ただしよっぽどの理由がない限り、セントラルリポジトリを使うでしょう。

ここまでの話だと「基本的にセントラルリポジトリを使えばいいよね」となりそうです。

では、自分自身でリモートリポジトリやローカルリポジトリを使うのは、どういう場合になるでしょうか。

例えば、

  • 過去にはセントラルリポジトリで公開されていた
  • しかし、そのライブラリはセントラルリポジトリからは削除されてしまった
  • ローカルにライブラリの本体だけは残る
  • 現在進行形でプロジェクトで利用しており、最悪そのライブラリを自分たちでメンテナンスしないといけない(バグ修正やセキュリティ的な理由で)
  • しかもライセンスや著作権の関係でインターネット上では公開できない

という場合だとどうでしょう。

修正が発生した際に社内の開発者全員に修正後のライブラリを使わせたい、あるいはそのライブラリ内部で他のライブラリを使っていて依存関係を管理する必要があるということを考えると、これまで通りパッケージ管理ソフトの力を借りたいですよね。

そんな場合に、社内ネットワーク上に立てたリモートリポジトリや、あるいはローカルリポジトリを利用する必要があるわけです。

※リモートリポジトリとローカルリポジトリは、クライアントがどこから使うかによって区別されるのでリモートリポジトリもローカルリポジトリ足りえます。

リポジトリにライブラリを登録する方法

セントラルリポジトリの場合は簡単です。

例えばnpmの場合だと、パッケージ管理ソフトの提供元が公開しているサイトから自身で作成したリポジトリを登録するだけです。

これはnpmに限った話ではなく、基本的にどのパッケージ管理ソフトでも同様です。

では、セントラルリポジトリ以外にライブラリを登録するにはどうすればいいでしょうか。

今回はJavaのパッケージ管理ソフトであるMavenを例に、ローカルリポジトリへのライブラリ登録方法を説明します。

npmとcomposerに関しては以下のページがお役に立ちそうです。

ここから先はMavenで自作ライブラリを作成する方法を説明します。

それにあたってのサンプルを置いておきます。

Mavanのインストール

このあたりの記事をご参考に。

WindowsへのMavenインストール

Apache Maven 3.5をmacOSにHomebrewでインストールする手順

パッケージの作成

任意のディレクトリへ移動して、パッケージを作成します。

今回は、~/projact/mvn-local-libで作成するものとします。

任意のディレクトリへ移動したら、以下のコマンドを実行。

mvn archetype:generate

途中、いくつか聞かれるので次のように回答します。

(※マークが質問箇所)

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 2004: 
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
7: 1.3
8: 1.4
Choose a number: 8: ※
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.pom (1.6 kB at 4.3 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-bundles/1.4/maven-archetype-bundles-1.4.pom (4.5 kB at 11 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.4/maven-archetype-quickstart-1.4.jar (7.1 kB at 18 kB/s)
Define value for property 'groupId': com.localrepo ※
Define value for property 'artifactId': mvn-local-lib ※
Define value for property 'version' 1.0-SNAPSHOT: :  ※
Define value for property 'package' com.localrepo: : greet ※
Confirm properties configuration:
groupId: com.localrepo
artifactId: mvn-local-lib
version: 1.0-SNAPSHOT
package: greet
 Y: :

これでパッケージの雛形が出来上がります。

ライブラリ(ソースコード)の作成

今回はApp.javaとGreet.javaを作成し、与えられた引数によってあいさつの内容が変わるライブラリを作成します。

完成形のパッケージ構造は以下のようなイメージです。

package org.example;

public class Greet {
    private String name = "";
    private String greet = "";

    public Greet(String name, String greet){
        this.name = name;
        this.greet = greet;
    }

    public void greet(){
        System.out.println(this.greet + ", " + this.name);
    }
}
package org.example;

public class Main {
    public static void main(String[] args) {
        Greet greetobj = new Greet("Taro", "GoogMorning");
        greetobj.greet();
    }
}

ではプログラムを実行して、"GoogMorning, Taro"とコンソールに表示されることを確認してください。

確認できたら次のステップへ行きます。

ライブラリ(Jar)の作成

前のステップで作成したソースコードをJarファイルにしていきます。

まずはpom.xmlを修正します。

buildタグの中に以下を追加してください。

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- 追加開始 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>greet.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 追加終了 -->
      </plugins>
    </pluginManagement>
  </build>

このpom.xmlに追加する際のgroupIdとartifactIdには上記のorg.apache.maven.pluginsとmaven-jar-pluginを指定することで、作成されたJarファイルをjava -jarとして実行することが可能です。

今回これを追加しているのは、作成されたJarファイルが正常に実行できるかを確認したいからです。

ではJarを作成します。

以下のコマンドを~/projact/mvn-local-libで叩きます。

mvn package

正常にビルドされると、targetフォルダの中にJarが出来上がります。

ではこれが実行できるかを確認します。

java -jar mvn-local-lib-1.0-SNAPSHOT.jar

ステップ3と同様に、"GoogMorning, Taro"とコンソールに表示されることを確認してください。

ローカルリポジトリへ作成したライブラリをインストール

~/projact/mvn-local-libで以下のコマンドを実行します。

mvn install

Mavenのローカルリポジトリは、~/.m2/repository/の配下に作成され、今回の場合だと~/.m2/repository/com/localrepo/mvn-local-libができていることがわかります。

ローカルリポジトリにライブラリを追加する際のオプションはこの他にもあります。

詳しくはこちらの記事をご参照ください。

作成したライブラリを利用する

新たにMavenプロジェクトを立ち上げたうえで、pom.xmlを編集します。

dependenciesに以下のコードを追加します。

    <dependencies>
        <dependency>
            <groupId>com.localrepo</groupId>
            <artifactId>mvn-local-lib</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

ここに記載したgroupId~versionの情報は、先ほど作成したライブラリのpom.xmlの内容を貼り付けるといいです。

依存性を記載し、ライブラリがインストールされるはずなので、インストールされたライブラリに含まれるGreetを利用します。

package org.example;

import greet.Greet;

public class Main {
    public static void main(String[] args) {
        Greet greetobj = new Greet("Momoko", "Goognight");
        greetobj.greet();
    }
}

このプログラムを実行し、"Goodnight, Momoko"が表示されることが確認できればOKです。

まとめ

というわけでパッケージ管理ソフトのリポジトリの種類と、自作ライブラリをローカルリポジトリに登録する方法についてでした。

この記事を書いたきっかけは、業務中にローカルリポジトリ関係でハマったからです。

IntelliJがライブラリがないというエラーを吐きまくっていて、その原因がIntelliJがMavenのローカルリポジトリの場所を正しく認識していないからというもの。

そこで初めて、「ローカルリポジトリなんてあるの?」となったので、備忘録を兼ねての記事でした。

直近の推し5選!

1

みなさんこんばんは。 こんにちは、Kanon です。今回は… しめさば先生の『君は僕の後悔』の感想記事です。 しめさば先生はこれまでにも『ひげを剃る。そして女子高生を拾う』や『きみは本当に僕の天使なの ...

2

リンク あらすじ 人生オール80点。 そんな俺が託されたのは、元トップアイドル・香澄ミルの世話だった。 ファン対応がしみつきなかなかクラスに馴染めないミル。 そんな彼女に頼られるうち、俺たちは図らずも ...

3

リンク 二丸先生の他の作品はこちら あらすじ 記憶喪失の湖西廻の前に現れたのは、清純で素朴な美少女、丹沢白雪。 「──私、廻くんと恋人だったの」  白雪はそう言って顔を赤らめ、廻の頬にキスをする。   ...

4

リンク あらすじ その夜、僕の青春は〈炎〉とともに産声をあげた――  スマホを忘れて夜の学校に忍び込んだ在原有葉(ありはらあるは)は、屋上を照らす奇妙な光に気づく。そこで出会ったのは、闇夜の中で燃え上 ...

5

こんにちは、Kanon です。今回は… しめさば先生の『きみは本当に僕の天使なのか』の感想記事です。 表紙とタイトルを見るに幻想的な恋の話のように思えるのですが、実はタイトルはそんな幻のようなものでは ...

-Tech
-, , , , , , , , , , ,