web-dev-qa-db-ja.com

githubでMavenリポジトリをホスティングする

私はgithubで作業している小さなオープンソースライブラリのフォークを持っています。私はそれをmavenを通して他の開発者に利用可能にしたいのですが、私は私自身のNexusサーバーを動かしたくありません、そしてそれはフォークであるので私はoss.sonatype.orgにそれを容易に展開することができません。

私がやりたいことは、他の人がmavenを使ってアクセスできるようにgithubにデプロイすることです。これを行うための最良の方法は何ですか?

294
emmby

私が見つけることができた最良の解決策はこれらのステップから成ります:

  1. あなたのMavenアーティファクトをホストするmvn-repoという名前のブランチを作成してください。
  2. Github site-maven-plugin を使用してアーティファクトをgithubにプッシュします。
  3. リモートのmvn-repoをmavenリポジトリとして使用するようにmavenを設定します。

この方法を使用することにはいくつかの利点があります。

  • Maven成果物は、githubページがmvn-repoという別のブランチに保存されているように、gh-pagesという別のブランチにソースとは別に保存されます(githubページを使用する場合)。
  • 他の提案された解決策とは異なり、あなたがそれらを使用しているならそれはあなたのgh-pagesと衝突しません。
  • Deployターゲットと自然に結び付くので、学ぶための新しいmavenコマンドはありません。通常どおりにmvn deployを使用するだけです。

アーティファクトをリモートのmavenリポジトリにデプロイする典型的な方法はmvn deployを使うことですので、この解決策のためにそのメカニズムにパッチを当てましょう。

まず、ターゲットディレクトリ内の一時的なステージング場所にアーティファクトをデプロイするようにMavenに指示します。これをあなたのpom.xmlに追加してください:

<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <name>Temporary Staging Repository</name>
        <url>file://${project.build.directory}/mvn-repo</url>
    </repository>
</distributionManagement>

<plugins>
    <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
            <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
        </configuration>
    </plugin>
</plugins>

それではmvn clean deployを実行してみてください。 Mavenリポジトリをtarget/mvn-repoにデプロイしたことがわかります。次のステップはそのディレクトリをGitHubにアップロードすることです。

Github ~/.m2/settings.xmlがGitHubにプッシュできるように、認証情報をsite-maven-pluginに追加します。

<!-- NOTE: MAKE SURE THAT settings.xml IS NOT WORLD READABLE! -->
<settings>
  <servers>
    <server>
      <id>github</id>
      <username>YOUR-USERNAME</username>
      <password>YOUR-PASSWORD</password>
    </server>
  </servers>
</settings>

(注意してください、誰かがあなたのパスワードをあなたのファイルで読むことができないことを確実にするためにchmod 700 settings.xmlを忘れないでください。

それから、あなたのpomに以下を追加して、今設定した新しいサーバーについてGitHubのsite-maven-pluginに伝えてください。

<properties>
    <!-- github server corresponds to entry in ~/.m2/settings.xml -->
    <github.global.server>github</github.global.server>
</properties>

最後に、一時的なステージングリポジトリからGithubのsite-maven-pluginブランチにアップロードするようにmvn-repoを設定します。

<build>
    <plugins>
        <plugin>
            <groupId>com.github.github</groupId>
            <artifactId>site-maven-plugin</artifactId>
            <version>0.11</version>
            <configuration>
                <message>Maven artifacts for ${project.version}</message>  <!-- git commit message -->
                <noJekyll>true</noJekyll>                                  <!-- disable webpage processing -->
                <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory> <!-- matches distribution management repository url above -->
                <branch>refs/heads/mvn-repo</branch>                       <!-- remote branch name -->
                <includes><include>**/*</include></includes>
                <repositoryName>YOUR-REPOSITORY-NAME</repositoryName>      <!-- github repo name -->
                <repositoryOwner>YOUR-GITHUB-USERNAME</repositoryOwner>    <!-- github username  -->
            </configuration>
            <executions>
              <!-- run site-maven-plugin's 'site' target as part of the build's normal 'deploy' phase -->
              <execution>
                <goals>
                  <goal>site</goal>
                </goals>
                <phase>deploy</phase>
              </execution>
            </executions>
        </plugin>
    </plugins>
</build>

mvn-repoブランチは存在する必要はありません、それはあなたのために作成されます。

もう一度mvn clean deployを実行してください。 maven-deploy-pluginがターゲットディレクトリのローカルステージングリポジトリにファイルを「アップロード」してから、site-maven-pluginがそれらのファイルをコミットしてサーバーにプッシュするのを見るはずです。

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building DaoCore 1.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-deploy-plugin:2.5:deploy (default-deploy) @ greendao ---
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.jar (77 KB at 2936.9 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/greendao-1.3-20121223.182256-3.pom (3 KB at 1402.3 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/1.3-SNAPSHOT/maven-metadata.xml (768 B at 150.0 KB/sec)
Uploaded: file:///Users/mike/Projects/greendao-emmby/DaoCore/target/mvn-repo/com/greendao-orm/greendao/maven-metadata.xml (282 B at 91.8 KB/sec)
[INFO] 
[INFO] --- site-maven-plugin:0.7:site (default) @ greendao ---
[INFO] Creating 24 blobs
[INFO] Creating tree with 25 blob entries
[INFO] Creating commit with SHA-1: 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] Updating reference refs/heads/mvn-repo from ab7afb9a228bf33d9e04db39d178f96a7a225593 to 0b8444e487a8acf9caabe7ec18a4e9cff4964809
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.595s
[INFO] Finished at: Sun Dec 23 11:23:03 MST 2012
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------

ブラウザでgithub.comにアクセスし、mvn-repoブランチを選択して、すべてのバイナリがそこにあることを確認します。

enter image description here

おめでとうございます!

mvn clean deployを実行するだけで、あなたのmavenアーティファクトを貧しい人の公開リポジトリに配置することができます。

もう1つのステップがあります。それはあなたのpomに依存するpomをあなたのリポジトリがどこにあるかを知るように設定することです。プロジェクトに依存するプロジェクトのpomに次のスニペットを追加します。

<repositories>
    <repository>
        <id>YOUR-PROJECT-NAME-mvn-repo</id>
        <url>https://raw.github.com/YOUR-USERNAME/YOUR-PROJECT-NAME/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

あなたのjarファイルを必要とするどんなプロジェクトでも自動的にあなたのgithub mavenリポジトリからそれらをダウンロードするでしょう。

編集:コメント( '作成エラー:無効な要求です。'プロパティ/名前 'では、nilは文字列ではありません)に記載されている問題を回避するには、githubのプロファイルに名前を記載してください。

463
emmby

GitHubをMavenリポジトリとして使用しないでください。

編集:このオプションはたくさんの賛成票を得ますが、その理由についてのコメントはありません。これは、GitHubで実際にホスティングするための技術的な機能に関係なく、正しい選択肢です。 ] GitHubでのホスティングは、以下に概説するすべての理由から間違っています。コメントがないと、問題を明確にするために回答を改善することはできません。

最良の選択肢 - 元のプロジェクトと共同作業する

最善の選択肢は、元のプロジェクトに変更を含めて元のプロジェクトに固執するよう説得することです。

代替案 - あなた自身のフォークを維持する

あなたがオープンソースライブラリをフォークし、あなたのフォークもオープンソースであるので、あなたはそれに新しいgroupIdを与えることでMaven Centralにフォークをアップロードすることができます( アーティファクトをCentral Repositoryにアップロードするためのガイド )。新しいartifactIdかもしれません。

変更が元のプロジェクトに組み込まれるまでこのフォークを維持しても構わない場合にのみこのオプションを検討してください。

本当にフォークが正しい選択肢であるかどうかを真剣に考えてください。 'なぜフォークしない' についてのGoogleの無数の結果を読む

推論

リポジトリをjarファイルで膨らませるとダウンロードサイズが大きくなります

Jarはあなたのプロジェクトのoutputです、jarはそのinputsからいつでも再生成することができます、そしてあなたのGitHubレポジトリはinputsだけを含むべきです。

私を信じていませんか?その後、Googleの検索結果で 'バイナリをgitに保存しない' を確認してください。

GitHubによる大きなファイルの取り扱い 同じことがわかります。確かにjarはそれほど大きくはありませんが、それらはソースコードよりも大きく、リリースによってjarが作成された後はバージョン管理される理由はありません - それが新しいリリースの目的です。

pom.xmlで複数のリポジトリを定義すると、リポジトリ数×アーティファクト数の分だけビルドが遅くなります

スティーブンコノリー 言う

誰かがあなたのレポを追加した場合、彼らは今やアーティファクトをチェックする別のレポを持っているので彼らのビルドパフォーマンスに影響を与えます...ただ一つのレポを追加する必要があるならそれは大きな問題ではありません。 Mavenのビルドはすべてのアーティファクトについて50のレポをチェックしており、ビルド時間は犬です。

そのとおり! Mavenはpom.xmlで定義されたすべての成果物(およびその依存関係)を、定義したすべてのリポジトリと照合する必要があります。それらのリポジトリのどれか。

自分で試してみると、遅いビルドの痛みを感じるでしょう。

アーティファクトの最適な場所はMaven Centralです。これはjarの中心的な場所です。つまり、ビルドは1つの場所しかチェックしないということです。

リポジトリについてもっと詳しく知るには、Mavenのドキュメントで リポジトリの紹介 を参照してください。

114
Bae

GitHubリポジトリをMavenアーティファクトとして公開するには、 JitPack (公開Gitリポジトリは無料)を使用できます。それは非常に簡単です。ユーザーはこれをpom.xmlに追加する必要があります。

  1. リポジトリを追加します。
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
  1. 依存関係を追加します。
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

答えとして 他の場所で そのアイデアはJitPackがあなたのGitHubリポジトリを構築し、jarファイルを提供するということです。必要条件はあなたがビルドファイルとGitHubリリースを持っていることです。

いいことは、展開やアップロードを処理する必要がないということです。あなた自身のアーティファクトリポジトリを維持したくないので、それはあなたのニーズにぴったりです。

42
Andrejs

もう一つの選択肢は、webdavをサポートするWebホスティングを使用することです。もちろん、これにはある程度のスペースが必要になりますが、セットアップは簡単で、本格的なnexusサーバーを実行するのに適した方法です。

これをあなたのビルドセクションに追加してください

     <extensions>
        <extension>
        <artifactId>wagon-webdav-jackrabbit</artifactId>
        <groupId>org.Apache.maven.wagon</groupId>
        <version>2.2</version>
        </extension>
    </extensions>

このようなものをあなたのdistributionManagementセクションに追加してください。

<repository>
    <id>release.repo</id>
    <url>dav:http://repo.jillesvangurp.com/releases/</url>
</repository>

最後に、settings.xmlでリポジトリアクセスを設定してください。

これをあなたのサーバーのセクションに追加してください。

    <server>
        <id>release.repo</id>
        <username>xxxx</username>
        <password>xxxx</password>
    </server>

そしてあなたのリポジトリセクションの定義

            <repository>
                <id>release.repo</id>
                <url>http://repo.jillesvangurp.com/releases</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>

最後に、標準的なphpホスティングがあれば、sabredavのようなものを使ってwebdav機能を追加することができます。

利点:あなたはあなた自身のmavenリポジトリを持っています欠点:あなたはnexusの管理機能のどれも持っていません。どこかにwebdav設定が必要です

8
Jilles van Gurp

別の方法として、 Bintray はMavenリポジトリの無料ホスティングを提供します。 groupIdの名前を絶対に変更したくない場合は、おそらく Sonatype OSS およびMaven Centralの代わりになるでしょう。ただし、少なくとも変更を上流に統合するか、名前を変更してCentralに公開するようにしてください。他の人があなたのフォークを使うのがずっと簡単になります。

7
Guillaume

aarまたはjarファイル自体しかない場合、または単にプラグインを使用したくない場合 - 作成した 単純なシェルスクリプト 。あなたはそれを同じように達成することができます - あなたのアーティファクトをGithubに公開し、それを公開Mavenリポジトリとして使用します。

0
Orest Savchak