我有一个我想用Maven构建的闭源项目。它依赖于两个java库,这些库在我能够找到的任何公共存储库中都不可用(在这种情况下,libGoogleAnalytics.jar和FlurryAgent.jar,但该问题适用于任何闭源依赖项)。
我希望组织中的任何人能够使用我用来构建应用程序的完全相同的依赖项版本来构建应用程序。这包括我的同事和我们的构建服务器。
如何管理maven不知道如何解决的闭源依赖?
显然,我可以去每个人的机器并手动执行“mvn install:install-file”以将二进制文件放入他们的maven存储库,但是手动管理这样的依赖关系会破坏依赖关系管理器的目的。
根据maven的Internal Repositories文档,我可以在某处设置存储库服务器并将二进制文件放在那里,然后所有开发人员都可以访问它们。但这意味着我需要维护一台新服务器(或至少在现有服务器上建立一个新网站)。这也意味着我必须担心权限,以确保外部各方无法访问存储库。这也意味着我现在必须担心备份和可用性,这样如果存储库不可用,开发人员就不会遇到打嗝。
如果我能以某种方式使用我们现有的scm(在这种情况下为hg,但可能是git或svn或其他)来存储依赖项,那么所有这些问题都会消失。我们的源代码控制存储库已经备份,它基本上总是可供开发人员使用构建版本,并且已经处理了它的权限。
但是,如果可能的话,我还无法弄清楚如何使用hg来管理maven依赖项。
答案 0 :(得分:10)
事实证明,曼弗雷德的答案并不适合我。该应用已编译,但由于所需的Google分析类缺失,因此无法在我的Android设备上运行。
根据他提供的链接,我发现this solution实际上有点干净且工作正常。
总之,我在pom.xml中添加了以下依赖项。 groupId,artifactId和version都是由我使用合理的值组成的:
<dependencies>
...
<dependency>
<groupId>com.google.android.apps.analytics</groupId>
<artifactId>libGoogleAnalytics</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.flurry</groupId>
<artifactId>FlurryAgent</artifactId>
<version>1.24</version>
</dependency>
</dependencies>
然后我为我在项目的源代码树中存储第三方依赖项的位置添加了一个存储库定义:
<repository>
<id>third.party.closed.source.repo</id>
<url>file://${basedir}/../maven_repo_3rd_party</url>
</repository>
然后我将jar文件移动到以下位置:
./maven_repo_3rd_party/com/google/android/apps/analytics/libGoogleAnalytics/1.1/libGoogleAnalytics-1.1.jar
./maven_repo_3rd_party/com/flurry/FlurryAgent/1.24/FlurryAgent-1.24.jar
一旦我这样做了,我的项目编译并运行就好像第三方依赖关系是从官方maven仓库解决的。
答案 1 :(得分:5)
虽然我真的认为你应该使用一个专用的存储库服务器而Sean Patrick完全正确,但这是一个让它工作的黑客。
将jar文件放在libs文件夹中,就像过去的日子一样(记住Ant .. ouch)..然后使用范围系统和路径声明每个jar的依赖关系。
我在这里描述的一个例子是
具体而言,依赖性将是例如看起来像这样
<dependency>
<groupId>jasperreports</groupId>
<artifactId>jasperreports-chart-themes</artifactId>
<version>3.7.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/jasperreports-chart-themes-3.7.0.jar</systemPath>
</dependency
哦,现在我告诉你如何做到这一点,请记住,这是一个不好的做法,并有一堆问题,但它会工作......
答案 2 :(得分:3)
根据maven的内部存储库 文档,我可以设置一个 存储库服务器在某处并放置 所有的二进制文件 然后开发人员可以访问。
完全。设置具有多个存储库的maven存储库服务器,例如这些:
internal-releases
internal-snapshots
external-opensource
external-closedsource
(这就是我们谈论的lib所在的地方)但这意味着我有一台新服务器 维护(或至少一个新的网站 现有服务器)。这也意味着我有 担心权限以确保 外部各方无法访问存储库。
是的,但是进行认真软件开发的公司应该有这样的基础设施。但是,如果您的公司认真使用Maven,那么可能还应该有一个专门的配置管理职位,那个人应该管理这个服务器。
这也意味着我不得不担心 备份和可用性现在这样 开发人员不会遇到打嗝 存储库不可用。
标准存储库服务器(例如Sonatype Nexus)坚如磐石。如果它挂起,只需重新启动它正在运行的app server / servlet容器。此外,一旦开发人员从repo下载了一个库,它就会保留在本地仓库中,所以即使repo关闭,也应该没有问题(但是当服务器关闭时你不能引用新的依赖关系)
好的,如果您真的想将SCM用作maven回购,请按以下步骤操作:
http://maven-svn-wagon.googlecode.com/svn/site/index.html
本文介绍如何为您自己的项目设置基于SVN的maven存储库。但是如果你想在回购中部署第三方,只需用这里提到的配置创建一个pom,然后用那个pom来deploy:deploy-file你的库。
(还有其他的wagon / scm实现,配置略有不同,但解决方案保持不变:根据您正在使用的货车实现创建一个pom,然后执行deploy:deploy-file
(查看更多信息在the usage page)