在 github 上托管 Maven 存储库

Posted

技术标签:

【中文标题】在 github 上托管 Maven 存储库【英文标题】:Hosting a Maven repository on github 【发布时间】:2012-12-10 10:06:32 【问题描述】:

我有一个在 github 上工作的小型开源库的分支。我想通过 maven 将它提供给其他开发人员,但我不想运行我自己的 Nexus 服务器,而且因为它是一个分支,所以我不能轻易地将它部署到 oss.sonatype.org。

我想做的是将它部署到 github,以便其他人可以使用 maven 访问它。最好的方法是什么?

【问题讨论】:

您在 OSS Sonatype 中面临哪些许可问题?只是好奇,因为我自己使用它。 有一个工具可以让你直接通过 maven 暴露你的 GitHub repo。 jitpack.io***.com/a/28483461/3975649 Github 还宣布了一个支持 maven 的包注册表。目前处于公测阶段:github.com/features/package-registry 【参考方案1】:

我能找到的最佳解决方案包括以下步骤:

    创建一个名为 mvn-repo 的分支来托管您的 Maven 工件。 使用 github site-maven-plugin 将您的工件推送到 github。 配置 maven 以使用您的远程 mvn-repo 作为 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 以确保没有人可以读取文件中的密码。如果有人知道如何让 site-maven-plugin 提示输入密码而不是在配置文件中要求它,让我知道。)

然后通过将以下内容添加到您的 pom 中,告诉 GitHub site-maven-plugin 您刚刚配置的新服务器:

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

最后,配置 site-maven-plugin 以从您的临时暂存存储库上传到您在 Github 上的 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 分支,并验证您的所有二进制文件现在都在那里。

恭喜!

您现在只需运行 mvn clean deploy 即可将您的 maven 工件部署到穷人的公共仓库。

您还需要采取一个步骤,即配置任何依赖于您的 pom 的 pom 以了解您的存储库在哪里。将以下 sn-p 添加到依赖于您的项目的任何项目的 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 存储库下载它们。

编辑:为避免 cmets 中提到的问题(“创建提交时出错:请求无效。对于“属性/名称”,nil 不是字符串。”),请确保在 github 上的个人资料中声明名称。

【讨论】:

另请注意,此解决方案将在您每次部署时覆盖您以前的工件。这适用于快照存储库,但不适用于已发布的工件。要禁用该行为,请在您的 site-maven-plugin 配置中设置 &lt;merge&gt;true&lt;/merge&gt;。但是,如果您这样做,我认为您必须在第一次手动创建 github 中的 mvn-repo 分支并删除其所有文件。 +1 聪明且表现出色。我唯一的批评是您没有包含指向 Maven 插件站点的链接:github.com/github/maven-plugins。谢谢,我正在寻找一种将我的 Maven 站点发布到 github 的方法! 在 github 上使用双重身份验证时,此方法不起作用。请在此处查看我在问题中的说明:github.com/github/maven-plugins/issues/36#issuecomment-31005606 为了使这项工作适用于多模块项目,您还可以简单地将&lt;altDeploymentRepository&gt;internal.repo::default::file://$user.dir/target/mvn-repo&lt;/altDeploymentRepository&gt;maven-deploy-plugin一起使用, &lt;outputDirectory&gt;$user.dir/target/mvn-repo&lt;/outputDirectory&gt;site-maven-plugin。这会将所有工件部署到根(“父”)项目中,并将它们推送到 github 上的相应父目录。否则,每个子模块的构建都会覆盖之前构建的子模块... 让它工作的两个建议(至少对我来说):设置当前版本的 Github 插件(现在应该是 0.11)。另外我建议大家使用 OAUTH 令牌而不是密码。您可以在“设置->应用程序->个人访问令牌”中生成它。你也可以通过将它内联到 POM 中并将令牌存储为环境变量。 &lt;github.global.userName&gt;YourUserName&lt;/github.global.userName&gt; &lt;github.global.password&gt;$GITHUB_OAUTH_TOKEN&lt;/github.global.password&gt;【参考方案2】:

不要将 GitHub 用作 Maven 存储库。

编辑:这个选项得到了很多反对票,但没有 cmets 说明原因。无论在 GitHub 上实际托管的技术能力如何,这都是正确的选择。由于下面列出的所有原因,在 GitHub 上托管是错误的,如果没有 cmets,我无法改进答案以澄清您的问题。

最佳选择 - 与原始项目合作

最好的选择是说服原始项目包含您的更改并坚持原始项目。

替代方案 - 维护自己的 Fork

由于您已经 fork 一个开源库,并且您的 fork 也是开源的,因此您可以将您的 fork 上传到 Maven Central(阅读 Guide to uploading artifacts to the Central Repository),方法是给它一个新的 groupId 或者一个新的 artifactId

仅当您愿意在更改合并到原始项目中之前维护此分叉时才考虑此选项,然后您应该放弃此选项。

认真考虑分叉是否是正确的选择。阅读'why not to fork' 的无数 Google 搜索结果

推理

用 jars 膨胀你的存储库会增加下载大小而没有任何好处

jar 是您项目的 output,它可以随时从其 inputs 重新生成,并且您的 GitHub 存储库应仅包含 inputs

不相信我?然后检查 'dont store binaries in git' 的 Google 结果。

GitHub's help Working with large files 会告诉你同样的事情。诚然,jar 并不大,但它们比源代码大,一旦某个版本创建了一个 jar,它们就没有理由进行版本控制——这就是新版本的用途。

在您的 pom.xml 中定义多个存储库会使您的构建速度减慢存储库数量乘以工件数量

斯蒂芬康诺利says:

如果有人添加您的存储库,他们会影响他们的构建性能 因为他们现在有另一个回购来检查工件......这不是一个大 如果您只需要添加一个 repo 就会出现问题......但是问题越来越大,下一个 你知道你的 maven 构建是为每个工件检查 50 个 repos 和 构建时间是一条狗。

没错! Maven 需要根据您定义的每个存储库检查 pom.xml 中定义的每个工件(及其依赖项),因为任何这些存储库中都可能提供更新的版本。

亲自尝试一下,您会感受到构建缓慢的痛苦。

工件的最佳位置是 Maven Central,因为它是 jar 的中心位置,这意味着您的构建只会检查 一个 位置。

您可以在Introduction to Repositories 上的 Maven 文档中阅读更多关于存储库的信息

【讨论】:

完全同意,并且对于您想要保留一段时间的分叉是有意义的。但这对于现有项目的一个小补丁来说可能是很多开销。 我怀疑 Github 有问题,因为他们编写了启用此功能的插件。我同意这不是想法,但c'est la vie。 在 Sonatype 上部署开源项目并不总是可行的。例如,当您的项目依赖于另一个尚未部署的开源项目时(并且无法部署,因为它不符合 sonatype 要求)。 @Gab 那么你的依赖并不是真正的开源。您应该联系其他项目并解释这一点,并让他们修复他们的许可。 (Sun 是过去这种行为的罪魁祸首) @Bae 这不是许可问题。一些项目所有者决定不在中心发布只是因为这不是他们的优先事项。你的方式在现实世界中是不可能的。如果你想测试:说服它在 Central code.google.com/p/sd-dss 上发布。这是一个由欧盟社区资助的大型开源项目:)【参考方案3】:

您可以使用JitPack(公共 Git 存储库免费)将您的 GitHub 存储库公开为 Maven 工件。它很容易。您的用户需要将其添加到他们的 pom.xml:

    添加存储库:
<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>
    添加依赖:
<dependency>
    <groupId>com.github.User</groupId>
    <artifactId>Repo name</artifactId>
    <version>Release tag</version>
</dependency>

elsewhere 的回答是,JitPack 将构建您的 GitHub 存储库并提供 jars。要求是您有一个构建文件和一个 GitHub 版本。

好处是您不必处理部署和上传。由于您不想维护自己的工件存储库,因此它非常适合您的需求。

【讨论】:

JitPack 非常好,但会迫使您更改您拥有的每个 groupId。他们说这可以避免,但它要求您向公司的 DNS 添加一个条目,这在大多数情况下是完全不切实际的。我曾经尝试过 JP,然后我认为这太愚蠢了。 不需要更改项目的 groupId。您仍然可以使用 'com.github.User' groupId 安装这些项目。但也许您的用例有所不同。 是的,非常多。因为我的组织和外部用户周围已经有数十个这样的人,而且我希望他们拥有自己的品牌。一个人怎么会这么傻,试图强迫我加入他自己的 groupId 是我考虑转行的原因之一。 此外,我认为 JP 人员没有任何真正需要向我提出这样的要求(他们可以从存储库规范中拦截 Maven 请求)。 好主意,我做到了:github.com/jitpack/jitpack.io/issues/209,谢谢 :-)【参考方案4】:

自 2019 年起,您现在可以使用名为 Github package registry 的新功能。

基本上流程是:

从 github 设置生成新的个人访问令牌 在您的settings.xml 中添加存储库和令牌信息

部署使用

mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token  

【讨论】:

截至 2019 年,这是最好的选择。 但是对于别人使用它,他/她似乎需要使用相应的 URL 和身份验证信息配置 settings.xml 很奇怪...你创建了你的公共包,但其他人需要验证才能获得它 但是,对于私人回购,在一定的使用量/月之后,定价就会出现 Github Package Registry 对开源项目没有用处,因为客户端无法在未经授权的情况下下载工件。【参考方案5】:

另一种选择是使用任何支持 webdav 的网络托管。当然,您将需要一些空间来进行此操作,但设置起来很简单,并且是运行完整的 nexus 服务器的一个很好的替代方案。

将此添加到您的构建部分

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

将类似的内容添加到您的分发管理部分

<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 设置

【讨论】:

【参考方案6】:

作为替代方案,Bintray 提供免费托管 maven 存储库。如果您绝对不想重命名 groupId,这可能是 Sonatype OSS 和 Maven Central 的一个很好的替代方案。但是,请至少努力将您的更改集成到上游或重命名并发布到 Central。它让其他人更容易使用你的叉子。

【讨论】:

我尝试的时候简直不敢相信,但是 Bintray 不支持快照。没用。 它不再免费了。每月 150 美元。 我认为这是开源软件项目的费用:jfrog.com/open-source JFrog 正在关闭 Bintray 和 JCenter。 jfrog.com/blog/…【参考方案7】:

如果您只有 aarjar 文件本身,或者只是不想使用插件 - 我已经创建了 a simple shell script。您可以使用它来实现相同的目标 - 将您的工件发布到 Github 并将其用作公共 Maven 存储库。

【讨论】:

【参考方案8】:

我想添加另一个替代方案,我最近一直在研究的 Gradle 插件:magik。

基本上它允许直接在充当 maven 存储库的 github 存储库上发布。

【讨论】:

【参考方案9】:

我来这里是为了做同样的事情,免费托管我的 Maven 存储库,但经过更多研究后,我最终来到了这里: https://jfrog.com/start-free/

设置是quite strightforward,有一个很好的免费套餐,可以在可预见的未来为我服务,还有额外的(付费的)升级,将来很可能会派上用场。

到目前为止,我确实很高兴!

【讨论】:

以上是关于在 github 上托管 Maven 存储库的主要内容,如果未能解决你的问题,请参考以下文章

将本地项目放到GitHub上托管并展示

Ⅲ. 通过git管理github上托管的代码

Maven存储库有时可以工作

在 Linode 上托管 Rails 应用程序

在github上托管自己的项目

非公共工件的 Maven 存储库托管? [关闭]