在github上托pipe一个Maven仓库

我有一个在github上开发的小型开源库。 我希望通过maven让其他开发者可以使用它,但是我不想运行我自己的Nexus服务器,而且由于它是一个分支,我不能轻易地将其部署到oss.sonatype.org。

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

我已经能够find的最佳解决scheme包括以下步骤:

  1. 创build一个名为mvn-repo的分支来托pipe你的maven工件。
  2. 使用github site-maven-plugin将你的工件推送到github。
  3. configurationmaven使用你的远程mvn-repo作为maven仓库。

使用这种方法有几个好处:

  • Maven工件在一个名为mvn-repo的单独分支中与源保持分离,就像github页面保存在一个名为gh-pages的单独分支(如果使用github页面)
  • 不像其他一些build议的解决scheme,如果你使用它们,它不会与你gh-pages相冲突。
  • 与部署目标自然地联系起来,所以没有新的Maven命令可以学习。 只要mvn deploy使用mvn deploy

将工件部署到远程Maven仓库的典型方法是使用mvn deploy ,因此让我们为此解决scheme打补丁。

首先,告诉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目录。

将你的authentication信息添加到~/.m2/settings.xml这样github的site-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提示input密码而不是在configuration文件中要求,请让我知道。)

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

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

最后,将site-maven-pluginconfiguration为从临时分段存储库上传到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分支不需要存在,它将为您创build。

现在再次运行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,selectmvn-repo分支,并确认您的所有二进制文件现在都在那里。

在这里输入图像描述

恭喜!

你现在可以简单地通过运行mvn clean deploy将你的maven工件部署到一个穷人的公共repo中。

还有一个步骤是你想要的,那就是configuration任何依赖你的pom的poms来知道你的仓库在哪里。 将下面的代码片段添加到依赖于您的项目的任何项目的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仓库下载它们。

编辑:避免在注释中提到的问题('错误创build提交:无效的请求。'属性/名称',nil不是一个string'),请确保您在github上的configuration文件中声明名称。

不要使用GitHub作为Maven仓库。

编辑:这个选项得到很多的反对票,但没有评论为什么。 无论在GitHub上实际托pipe的技术能力如何,这都是正确的select。 在GitHub上托pipe是错误的所有原因概述如下,没有评论我不能改善答案澄清你的问题。

最好的select是说服原来的项目包括你的修改,并坚持原来的。

然而在其他方面:

你已经分叉了一个开源的库,你的叉也是开源的。 所以给它一个新的groupId,也许一个新的artifactId,然后上传到中央http://maven.apache.org/guides/mini/guide-central-repository-upload.html 。 然后,您可以pipe理这个分支,直到这些更改合并到父项目中,然后放弃这个分支。

为什么?

1)不要用jar子膨胀你的仓库,这是一件坏事。 它会增加你的仓库的大小和下载时间,没有任何好处。 此外,有些人指出,这可能会破坏Github的条款和条件。 非版本化的东西应该在http://pages.github.com/ – 但仍然不build立你的仓库。 使用Maven Central。

2)Stephen Connolly 说 :

如果任何人添加你的回购,他们会影响他们的build设性能,因为他们现在有另一个回购检查工件反对…这不是一个大问题,如果你只需要添加一个回购…但问题在增长,接下来你知道你的Maven的构build是检查每个神器50回购,build立时间是一只狗。

您可以在https://maven.apache.org/guides/introduction/introduction-to-repositories.html上阅读更多关于存储库的信息;

您可以使用JitPack将您的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将会构build你的GitHub仓库,并且将为jar子服务。 要求是你有一个构build文件和一个GitHub版本。

好的是你不必处理部署和上传。 由于您不想维护您自己的工件库,因此您的需求很好匹配。

另一种select是使用任何WebDAV支持Web托pipe。 当然你需要一些空间,但是build立起来很简单,而且是运行一个完整的nexus服务器的好select。

将其添加到您的构build部分

  <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托pipe,你可以使用像sabredav添加webdavfunction。

优点:你有自己的Maven仓库缺点:你没有任何联系的pipe理能力; 你需要一些webdav设置的地方

作为替代scheme, Bintray提供免费的主机存储库。 如果您绝对不想重命名groupId,那么这可能是Sonatype OSS和Maven Central的一个很好的select。 但是,请至less努力让您的更改整合到上游或重命名并发布到中央。 这让别人更容易使用你的分叉。