私は、github で作業している小さなオープン ソース ライブラリのフォークを持っています。Maven を介して他の開発者が利用できるようにしたいのですが、独自の Nexus サーバーを実行したくありません。これはフォークであるため、oss.sonatype.org に簡単にデプロイできません。
私がやりたいのは、それをgithubにデプロイして、他の人がmavenを使用してアクセスできるようにすることです。これを行う最善の方法は何ですか?
私は、github で作業している小さなオープン ソース ライブラリのフォークを持っています。Maven を介して他の開発者が利用できるようにしたいのですが、独自の Nexus サーバーを実行したくありません。これはフォークであるため、oss.sonatype.org に簡単にデプロイできません。
私がやりたいのは、それをgithubにデプロイして、他の人がmavenを使用してアクセスできるようにすることです。これを行う最善の方法は何ですか?
私が見つけた最善の解決策は、次の手順で構成されています。
mvn-repo
Maven アーティファクトをホストするために呼び出されるブランチを作成します。mvn-repo
を Maven リポジトリとして使用するように Maven を構成します。このアプローチを使用すると、いくつかの利点があります。
mvn-repo
これは、github ページが という別のブランチに保持されるのとgh-pages
同じです (github ページを使用する場合)。gh-pages
それらを使用している場合は競合しません。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-repo
Github のブランチにアップロードするように を構成します。
<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 のプロファイルに名前を記載してください。
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 のドキュメントで、リポジトリの詳細を読むことができます。
2019 年以降、 Github package registryと呼ばれる新しい機能を使用できるようになりました。
基本的にプロセスは次のとおりです。
settings.xml
を使用してデプロイ
mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token
代わりに、Bintrayは Maven リポジトリの無料ホスティングを提供します。groupId の名前を絶対に変更したくない場合は、おそらくSonatype OSSや Maven Central の代わりになるでしょう。ただし、少なくとも変更をアップストリームに統合するか、名前を変更して Central に公開するようにしてください。他の人があなたのフォークを使いやすくなります。