在github上托pipe一个Maven仓库
我有一个在github上开发的小型开源库。 我希望通过maven让其他开发者可以使用它,但是我不想运行我自己的Nexus服务器,而且由于它是一个分支,我不能轻易地将其部署到oss.sonatype.org。
我想要做的就是部署到github,以便其他人可以使用maven访问它。 什么是最好的方法来做到这一点?
我已经能够find的最佳解决scheme包括以下步骤:
- 创build一个名为
mvn-repo
的分支来托pipe你的maven工件。 - 使用github site-maven-plugin将你的工件推送到github。
- 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-plugin
configuration为从临时分段存储库上传到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中:
- 添加存储库:
<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>
正如其他地方所回答的那样,这个想法是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努力让您的更改整合到上游或重命名并发布到中央。 这让别人更容易使用你的分叉。