我有一个正在使用github的小型开源库的分支。我想通过maven将其提供给其他开发人员,但我不想运行自己的Nexus服务器,并且由于它是分支,因此我无法轻松地将其部署到oss.sonatype.org。
我想做的是将其部署到github,以便其他人可以使用maven访问它。最好的方法是什么?
我有一个正在使用github的小型开源库的分支。我想通过maven将其提供给其他开发人员,但我不想运行自己的Nexus服务器,并且由于它是分支,因此我无法轻松地将其部署到oss.sonatype.org。
我想做的是将其部署到github,以便其他人可以使用maven访问它。最好的方法是什么?
Answers:
我能够找到的最佳解决方案包括以下步骤:
mvn-repo
来托管您的Maven工件。mvn-repo
用作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
以便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提示输入密码,而不是在配置文件中要求输入密码,请告诉我。)
然后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
。
您还需要采取另一步,即配置所有依赖于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存储库下载它们。
编辑:为避免注释中提到的问题(“创建提交时出错:无效的请求。对于'properties / name',nil不是字符串。'),请确保在github的配置文件中声明一个名称。
<merge>true</merge>
在site-maven-plugin配置中进行设置。但是,如果这样做,我认为您将不得不在github中手动创建mvn-repo分支,并在第一时间删除其所有文件。
<altDeploymentRepository>internal.repo::default::file://${user.dir}/target/mvn-repo</altDeploymentRepository>
与Maven的部署,插件,并<outputDirectory>${user.dir}/target/mvn-repo</outputDirectory>
与网站Maven的插件。这会将所有工件部署到根(“父”)项目中,并将其推送到github上相应的父目录。否则,每个子模块的构建都将覆盖之前...的子模块的构建...
<github.global.userName>YourUserName</github.global.userName> <github.global.password>${GITHUB_OAUTH_TOKEN</github.global.password>
不要将GitHub用作Maven存储库。
编辑:此选项获得了很多反对,但没有评论为什么。不管实际在GitHub上托管的技术能力如何,这都是正确的选择。出于以下概述的所有原因,在GitHub上托管是错误的,并且没有评论,我无法改善答案以澄清您的问题。
最佳选择-与原始项目合作
最好的选择是说服原始项目包括您的更改并坚持使用原始项目。
另类-维护自己的叉子
由于您已经创建了一个开源库,并且您的fork也是开源的,因此可以通过给它一个新的(也可以是一个新的)将您的fork上载到Maven Central(请参阅将工件上载到Central Repository的指南)。groupId
artifactId
仅当您愿意维护此派生,直到将更改合并到原始项目中,然后再放弃此项目时,才考虑使用此选项。
真的要认真考虑叉子是否是正确的选择。阅读无数Google搜索结果,了解“为什么不分叉”
推理
用jar膨胀存储库会增加下载大小,但没有任何好处
jar是output
您项目中的一个,可以随时从其中重新生成inputs
,并且您的GitHub存储库应仅包含inputs
。
不相信我吗 然后在Google搜索结果中查找“不要在git中存储二进制文件”。
GitHub的帮助使用大文件将告诉您同样的事情。诚然,jar的大小并不大,但是比源代码大,一旦发行版创建了jar,就没有理由对其进行版本控制-这就是新发行版的目的。
在pom.xml中定义多个存储库会使存储库数量乘以工件数量而减慢构建速度
如果有人添加您的存储库,那么它们会影响构建性能,因为他们现在还有另一个存储库来检查工件。...如果您只需要添加一个存储库,这不是一个大问题。但是问题越来越严重,接下来您知道Maven构建正在为每个工件检查50个回购,构建时间简直是一条狗。
那就对了!Maven需要对照您定义的每个存储库检查pom.xml中定义的每个工件(及其依赖项),因为在任何这些存储库中都可能有较新的版本。
自己尝试一下,您会感到构建缓慢的痛苦。
放置文物的最佳位置是Maven Central,它是jars的中央位置,这意味着您的构建将只检查一个位置。
您可以在Maven的“ 存储库简介”文档中阅读有关存储库的更多信息。
您可以使用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>
正如在其他地方回答的那样,想法是JitPack将构建您的GitHub存储库并为jar提供服务。要求是您拥有一个构建文件和一个GitHub版本。
令人高兴的是,您不必处理部署和上传。由于您不想维护自己的工件存储库,因此它非常适合您的需求。
另一种选择是使用任何具有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设置
从2019年开始,您现在可以使用名为Github软件包注册表的新功能。
基本上,该过程是:
settings.xml
部署使用
mvn deploy -Dregistry=https://maven.pkg.github.com/yourusername -Dtoken=yor_token
或者,Bintray提供免费托管的Maven存储库。如果您绝对不想重命名groupId,那么这可能是Sonatype OSS和Maven Central 的不错选择。但是,请至少努力将更改集成到上游或重命名并发布到Central。这使得其他人更容易使用您的叉子。
如果您本身只有aar
或jar
文件,或者不想使用插件-我已经创建了一个简单的shell脚本。您可以使用它实现相同的目的-将工件发布到Github并将其用作公共Maven存储库。