328

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

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

4

9 回答 9

503

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

  1. 创建一个名为mvn-repo来托管您的 Maven 工件的分支。
  2. 使用 github site-maven-plugin将您的工件推送到 github。
  3. 配置 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 提示输入密码而不是在配置文件中要求输入密码,请告诉我。)

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分支,然后验证所有二进制文件现在都在那里。

在此处输入图像描述

恭喜!

现在,您只需运行mvn clean deploy.

您还需要采取一个步骤,即配置任何依赖于您的 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 上托管是错误的,如果没有评论,我无法改进答案以澄清您的问题。

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

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

替代方案 - 维护自己的 Fork

由于您已经 fork 了一个开源库,并且您的 fork 也是开源的,因此您可以将您的 fork 上传到 Maven Central(阅读将工件上传到 Central Repository 的指南),方法是给它一个新的groupId,也许是一个新的artifactId.

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

认真考虑分叉是否是正确的选择。阅读无数 Google 结果以了解“为什么不分叉”

推理

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

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

不相信我?然后检查谷歌搜索结果中的'dont store binaries in git'

GitHub 的帮助处理大文件会告诉你同样的事情。诚然,jar 并不大,但它们比源代码大,一旦一个版本创建了一个 jar,它们就没有理由进行版本控制——这就是新版本的用途。

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

斯蒂芬康诺利

如果有人添加您的仓库,他们会影响他们的构建性能,因为他们现在有另一个仓库来检查工件... maven build 为每个工件检查 50 个 repos,而构建时间是一条狗。

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

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

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

您可以在 Maven 关于存储库简介的文档中阅读更多关于存储库的信息

于 2014-03-05T22:30:53.137 回答
50

您可以使用JitPack(公共 Git 存储库免费)将您的 GitHub 存储库公开为 Maven 工件。它很容易。您的用户需要将其添加到他们的 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 版本。

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

于 2015-05-04T16:39:18.207 回答
20

自 2019 年以来,您现在可以使用称为Github 包注册表的新功能。

基本上流程是:

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

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

另一种选择是使用任何支持 webdav 的网络托管。当然,您将需要一些空间来进行此操作,但设置起来很简单,并且是运行完整的 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 设置

于 2013-09-27T13:49:10.800 回答
7

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

于 2014-08-24T13:00:26.000 回答
0

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

于 2018-10-09T20:58:41.520 回答
0

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

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

于 2021-05-26T06:48:57.960 回答
0

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

设置非常简单,有一个很好的免费套餐,可以在可预见的未来为我服务,并且有额外的(付费)升级,将来很可能会派上用场。

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

于 2021-11-21T20:13:30.973 回答