如何在maven项目中添加70个本地jar?

时间:2016-05-10 19:42:42

标签: java eclipse maven jar

为什么在拥有如此数量的本地罐子时使用 Maven

所以我们有一个客户端,有很多私人罐子和自定义罐子。 例如 commons-lang MyCompanyCustom.jar,它是 commons-lang.jar ,其中还有10个类。

所以在他们的环境中我们使用100%Maven而没有本地依赖。 但是在我们的网站上,我们在Eclipse中开发了用于开发的jar并且使用公共开发的Maven构建,但我们没有权限在组织存储库中添加它们的jar。

所以我们想要使用Maven这样的好东西:编译,测试,构建uber-jar,添加静态代码分析,生成java-docs,sources-jars等。不要这样做,一个接一个地借助于蚀。

所以我们有70个罐子,如果我在他们的环境中获得有效的pom,他们中的一些是公开的我在Maven Central找到了50个,但是其他20个就像我称之为“定制”罐子。我当然搜索了决定,但发现了这个:

<dependency>
    <groupId>sample</groupId>
    <artifactId>com.sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

所以对于所有20个我必须在开发maven配置文件中添加它? 有没有像Gradle这样的简单方法,您可以将所有文件夹及其依赖项添加到现有文件夹中?

同样在每个开发者的回购中逐个安装是不可接受的。

3 个答案:

答案 0 :(得分:2)

请忘记前面提到的system范围!太有问题......

理想情况下:

理想情况下,您的所有开发人员都可以访问您或他们组织中的Repository Manager(如果可能)。

您的系统集成测试的中心环境可能是?

或者,您可能有一个中央环境来测试提供所有依赖项的位置。此方法可用于模拟编译在客户端环境中的工作方式。另外,你只需设置一次罐子。

  

所以在他们的环境中我们使用100%Maven而没有本地依赖。   但是在我们的网站上,我们有Eclipse的开发用罐子   Maven与公共构建,但我们没有添加权限   他们在我们的组织存储库中的罐子。

根据您在上面引用的摘录中所说的内容,我相信您希望在您的构建pom.xml中设置,假设在客户端设置中将存在依赖关系。< / p>

特别是,当您表明该组织未授予您在存储库中添加其jar的权限时,我会使用provided范围。

Maven docs中所述,提供的依赖关系的定义如下:

  

这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。

所以基本上你假设这些依赖关系会出现在你客户的设置中。但是,这有一些局限性。这意味着您可以独立构建解决方案,但无法在本地进行测试,因为您不会在工作站上拥有依赖项。

如果您甚至无法访问罐子来配置您的中央环境,请询问您的客户是否可以提供DEV / SIT环境。

以上都没有?继承父pom。

为了避免每个(相关)项目的整个持续复制粘贴过程,maven具有集中依赖和插件配置的工具,其中之一是继承父pom的配置。正如以下documentation中解释的那样,这很简单:

  • 首先,您只需使用pom.xml创建一个项目,您可以在其中定义要集中的所有内容(注意,某些项目的构造略有不同);
  • 用作包装标签的属性选项pom:<packaging>pom</packaging>;
  • 在必须继承这些配置的pom中,在<parent> ... </parent>中设置父配置标签(文档非常清楚);
  • 现在每次更新任何&#34;全球&#34; pom配置只需要在每个项目上更新父版本。因此,您只需配置一次。

您也可以将这一点与上述解决方案结合使用,这样就可以找到最适合您需求的解决方案。

但是那里有一个很大的Maven世界,所以我建议在its doc's中读一读,以进一步认识你的可能性。我记得这些情况,因为我现在处于类似的情况。

祝你好运!

答案 1 :(得分:1)

TL; DR:MavenHoe创建一个Maven存储库服务器(不是目录),它为目录中的人工制品提供服务,如果需要,猜测您要求的内容。目的是避免复杂的版本同步 - 它只需要最接近请求G的任何东西:A:V。

我已经将MavenHoe项目移动到Github,该项目几乎因Google Code的下降而迷失。因此,我以完整答案的形式将其放在此处:

在处理类似条件时,你有一个选择是采用.jar的目录形式,并将其视为存储库。

前段时间我为此目的编写了一个工具。我的情况是我们正在构建JBoss EAP并重新编译每个依赖项。  这导致了成千上万的.jars,它们通常与它们的中心对应物相同(加上安全性和错误修复)。

我需要测试来对抗这些工件而不是中心工件。但是,Maven坐标是相同的。

因此,我写了这个“Maven存储库/代理”,它提供了工件,如果它找到了可能的东西,如果没有,它将请求代理到Central。

它可以从三个来源得出G:A:V:

  1. MANIFEST.MF
  2. META-INF/.../pom.xml
  3. 目录中文件的位置,以及如下配置文件:

    jboss-managed.jar      org/jboss/man/             jboss-managed      2.1.0.SP1     jboss-managed-2.1.0.SP1.jar
    getopt.jar             gnu-getopt/                getopt             1.0.12-brew   getopt-1.0.12-brew.jar
    jboss-kernel.jar       org/jboss/microcontainer/  jboss-kernel       2.0.6.GA      jboss-kernel-2.0.6.GA.jar
    jboss-logging-spi.jar  org/jboss/logging/         jboss-logging-spi  2.1.0.GA      jboss-logging-spi-2.1.0.GA.jar
    ...
    
  4. 第一列是.zip中的文件名;然后分别为groupId(带斜线或点),artifactId,版本,工件文件名。

    您的70个文件将列在此文件中。

    请在此页面查看更多信息:

    https://rawgit.com/OndraZizka/MavenHoe/master/docs/README.html

    该项目可用here 如果你没有找到更好的东西,请随意进行分叉和推动。

答案 2 :(得分:1)

另一个选择是项目RepoTree

这个从另一个只包含.jar的目录创建一个Maven存储库目录(不是服务器)。换句话说,它创建了必要的.pom文件和目录结构。它仅考虑归档中包含的元数据的精确信息(MANIFEST.MF,pom.xml)。

  

将工件从目录递归安装到本地的实用程序   基于Aether 1.7的Maven存储库

这是5岁,但仍然可以正常工作。