10

我有一个想使用 Maven 构建的闭源项目。它依赖于两个 java 库,这些库在我能够找到的任何公共存储库中都不可用(在本例中为 libGoogleAnalytics.jar 和 FlurryAgent.jar,但该问题适用于任何闭源依赖项)。

我希望我组织中的任何人都能够使用与我用于构建应用程序的依赖项的完全相同版本来构建应用程序。这包括我的同事和我们的构建服务器。


如何管理 maven 不知道如何解决的闭源依赖项?

显然,我可以到每个人的机器上手动执行“mvn install:install-file”来将二进制文件放入他们的 maven 存储库,但是像这样手动管理依赖项会破坏依赖项管理器的目的。

根据 maven 的Internal Repositories文档,我可以在某个地方设置一个存储库服务器并将二进制文件放在那里,然后所有开发人员都可以访问它。但这意味着我要维护一个新服务器(或至少在现有服务器上建立一个新网站)。这也意味着我必须担心权限以确保外部各方无法访问存储库。这也意味着我现在必须担心备份和可用性,这样如果存储库不可用,开发人员就不会遇到问题。

如果我能以某种方式使用我们现有的 scm(在这种情况下是 hg,但它可能是 git 或 svn 或其他)来存储依赖项,那么所有这些问题对我来说都会消失。我们的源代码控制存储库已经备份,基本上总是可供开发人员使用,并且已经处理了它的权限。

但是我还没有弄清楚如何使用 hg 管理 maven 依赖项,如果这可能的话。

4

3 回答 3

10

事实证明,曼弗雷德的回答对我不太适用。该应用程序已编译,但由于缺少所需的谷歌分析类,它没有在我的 Android 设备上运行。

按照他提供的链接,我发现这个解决方案实际上更干净并且工作正常。

总之,我在 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 repo 解决的一样。

于 2011-02-10T19:15:03.937 回答
5

虽然我真的认为您应该使用专用的存储库服务器,但 Sean Patrick 对此完全正确,这里有一个 hack 可以让它工作。

将 jar 文件放在 libs 文件夹中,就像您过去所做的那样(记住 Ant.. 哎哟).. 然后使用范围系统和路径声明对每个 jar 的依赖关系。

我可以这样做的一个例子在这里描述

http://www.simligility.com/2010/01/how-to-mavenize-a-typical-web-application-build-jasperserver-3-7-sample-webapp/

具体来说,依赖项看起来像这样

<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

哦,现在我告诉了你怎么做,记住这是不好的做法,有很多问题,但它会起作用......

于 2011-02-10T17:03:34.663 回答
3

使用专用的存储库服务器

根据 maven 的 Internal Repositories 文档,我可以在某个地方设置一个存储库服务器并将二进制文件放在那里,然后所有开发人员都可以访问它。

确切地。设置具有多个存储库的 maven 存储库服务器,例如:

  • internal-releases
  • internal-snapshots
  • external-opensource
  • external-closedsource(这就是我们所说的 lib 所在的位置)

但这意味着我要维护一个新服务器(或至少在现有服务器上建立一个新网站)。这也意味着我必须担心权限以确保外部各方无法访问存储库。

是的,但是一家从事严肃软件开发的公司应该拥有这样的基础设施。但是,如果您的公司对使用 Maven 很认真,那么可能还应该有一个专门的配置管理职位,这个人应该管理这个服务器。

这也意味着我现在必须担心备份和可用性,这样如果存储库不可用,开发人员就不会遇到问题。

标准的存储库服务器(例如Sonatype Nexus)是坚如磐石的。如果它挂起,只需重新启动它正在运行的应用服务器/servlet 容器。此外,一旦开发人员从 repo 下载了一个库,它就会保留在本地 repo 中,所以即使 repo 关闭,也不应该有问题(但是当服务器关闭时,您不能引用新的依赖项) .


将现有的 SCM 用作 Maven 存储库

好的,如果您真的想将 SCM 用作 maven 存储库,请按以下步骤操作:

http://maven-svn-wagon.googlecode.com/svn/site/index.html

本文介绍如何为您自己的项目设置基于 SVN 的 maven 存储库。但是,如果您想将第三方部署到 repo,只需使用此处提到的配置创建一个 pom 并使用该 pom 来部署:deploy-file您的库。

(还有其他 wagon / scm 实现,配置略有不同,但解决方案保持不变:根据您正在使用的 wagon 实现创建一个 pom,然后执行(参见使用页面deploy:deploy-file上的更多信息)

于 2011-02-10T16:29:54.217 回答