为什么在拥有如此数量的本地罐子时使用 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这样的简单方法,您可以将所有文件夹及其依赖项添加到现有文件夹中?
同样在每个开发者的回购中逐个安装是不可接受的。
答案 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环境。
为了避免每个(相关)项目的整个持续复制粘贴过程,maven具有集中依赖和插件配置的工具,其中之一是继承父pom的配置。正如以下documentation中解释的那样,这很简单:
<packaging>pom</packaging>
; <parent> ... </parent>
中设置父配置标签(文档非常清楚); 您也可以将这一点与上述解决方案结合使用,这样就可以找到最适合您需求的解决方案。
但是那里有一个很大的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:
MANIFEST.MF
META-INF/.../pom.xml
目录中文件的位置,以及如下配置文件:
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
...
第一列是.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岁,但仍然可以正常工作。