328

私は、github で作業している小さなオープン ソース ライブラリのフォークを持っています。Maven を介して他の開発者が利用できるようにしたいのですが、独自の Nexus サーバーを実行したくありません。これはフォークであるため、oss.sonatype.org に簡単にデプロイできません。

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

4

9 に答える 9

503

私が見つけた最善の解決策は、次の手順で構成されています。

  1. mvn-repoMaven アーティファクトをホストするために呼び出されるブランチを作成します。
  2. github site-maven-pluginを使用して、アーティファクトを github にプッシュします。
  3. リモートmvn-repoを Maven リポジトリとして使用するように Maven を構成します。

このアプローチを使用すると、いくつかの利点があります。

  • Maven アーティファクトは、ソースとは別の という別のブランチに保持されます。mvn-repoこれは、github ページが という別のブランチに保持されるのとgh-pages同じです (github ページを使用する場合)。
  • 他の提案されたソリューションとは異なり、gh-pagesそれらを使用している場合は競合しません。
  • デプロイ ターゲットと自然に結びつくため、新しい 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 にアップロードすることです。

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

<!-- 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、ファイル内のパスワードを誰も読み取れないようにしてください。config ファイルでパスワードを要求するのではなく、site-maven-plugin でパスワードを要求する方法を誰かが知っている場合は、お知らせください。)

site-maven-plugin次に、pom に以下を追加して、構成したばかりの新しいサーバーについてGitHub に伝えます。

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

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

<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ブランチを選択して、すべてのバイナリがそこにあることを確認します。

ここに画像の説明を入力

おめでとう!

を実行するだけで、Maven アーティファクトを貧乏人のパブリック リポジトリにデプロイできるようになりましたmvn clean deploy

もう 1 つ必要な手順があります。それは、pom に依存するすべての pom を構成して、リポジトリの場所を知ることです。プロジェクトに依存するプロジェクトの pom に次のスニペットを追加します。

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

これで、jar ファイルを必要とするプロジェクトはすべて、github maven リポジトリから自動的にダウンロードされます。

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

于 2012-12-23T18:43:35.797 に答える
129

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

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

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

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

代替 - 独自のフォークを維持する

オープン ソース ライブラリをフォークしており、フォークもオープン ソースであるためgroupId新しいartifactId.

このオプションは、変更が元のプロジェクトに組み込まれるまでこのフォークを維持する意思がある場合にのみ検討してください。その後、このフォークを放棄する必要があります。

フォークが正しい選択肢であるかどうかを真剣に検討してください。「フォークしない理由」に関する無数の Google の結果を読む

推論

リポジトリを jar で肥大化させるとダウンロード サイズが大きくなり、何のメリットもありません

jar はoutputプロジェクトの であり、その からいつでも再生成できinputsます。GitHub リポジトリには のみを含める必要がありますinputs

信じられない?次に、Google の結果で'dont store binaries in git'を確認します。

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

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

スティーブン・コノリー言います:

誰かがあなたのレポを追加すると、アーティファクトをチェックする別のレポがあるため、ビルドのパフォーマンスに影響を与えます... 1 つのレポを追加するだけであれば大きな問題ではありません... しかし、問題は大きくなり、次にあなたが知っていることはMaven ビルドはすべてのアーティファクトに対して 50 のリポジトリをチェックしており、ビルド時間は非常に長いです。

それは正しい!Maven は、pom.xml で定義されたすべてのアーティファクト (およびその依存関係) を、定義したすべてのリポジトリに対してチェックする必要があります。これらのリポジトリのいずれかで新しいバージョンが利用できる可能性があるためです。

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

成果物に最適な場所は、jar の中心的な場所である Maven Central です。これは、ビルドが1 つの場所のみをチェックすることを意味します。

リポジトリの紹介に関する Maven のドキュメントで、リポジトリの詳細を読むことができます。

于 2014-03-05T22:30:53.137 に答える
20

2019 年以降、 Github package registryと呼ばれる新しい機能を使用できるようになりました。

基本的にプロセスは次のとおりです。

  • github 設定から新しい個人用アクセス トークンを生成する
  • リポジトリとトークン情報を追加しますsettings.xml
  • を使用してデプロイ

    mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token  
    
于 2019-09-29T01:46:06.753 に答える
7

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

于 2014-08-24T13:00:26.000 に答える