如何在 maven 项目(编译、构建、打包)中包含 3rd 方 jar,其中添加本地 maven repo 不是一个选项?
How include 3rd party jars in maven project (compile, build, package) where adding local maven repo is not an option?
我们有一个 git 项目,其中包含一些第 3 方 jar,这些 jar 在任何 Maven 存储库中都不可用,并且位于项目的 "lib" 文件夹中。我需要将它们包含在编译、构建中,然后将它们打包到 WEB-INF/lib
中的 WAR 中。
我无法从命令行将它们添加为本地 Maven 存储库,因为这个项目需要为任何克隆存储库的人构建,而不需要他们 运行 额外的命令(我无法绕过这个要求) .
我看到有些人建议使用系统作用域,但 Maven 不会将它们打包到您的 WAR:
<dependency>
<groupId>com.roufid.tutorials</groupId>
<artifactId>example-app</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/yourJar.jar</systemPath>
</dependency>
如何让这些 jar 用于 compiling/inspection、构建然后打包到 WAR?
在systemPath中使用正斜杠(/)转反斜杠()。
<dependency>
<groupId>com.roufid.tutorials</groupId>`enter code here`
<artifactId>example-app</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}\lib\yourJar.jar</systemPath>
您可以使用:
- 系统范围,但通过
assembly
插件自行打包
- 与您的项目一起使用的 maven 存储库(即即时的 maven 存储库,与本地存储库基本相同,但无需担心额外的移动部分,因为此存储库遵循您的项目)。
对于 Maven repo on-the-fly 选项,你可以按照描述的那样做 here(也就是说,使用任何已经存在的 Maven repo,它已经包含你需要的 jar,比如你本地的,把它在你的项目中,然后使用相对路径从你的项目中引用这个 repo。
我假设您已经验证了您可能用于分发这些 jar 的任何机制都符合相关许可。如果可以,那么 jars 的创建者 not 似乎没有理由提供官方 Maven 分发,因此您最好的选择可能是游说他们这样做。但如果没有,但出于某种原因,他们将允许您分发 jar(通过克隆您的存储库,或通过您维护的单独的 Maven 存储库):
有几种方法。我更喜欢 不 将罐子放入 git 存储库的方法。
发布 Maven Repo
因此可以托管面向 public 的存储库并以这种方式提供工件。 pom 可以将面向 public 的存储库添加到构建中,这样克隆的人就可以构建而无需 运行 任何特殊命令。
运行 你自己的 repo 并不难。 Nexus 或 Artifactory jFrog 的 OSS 版本可能完全有能力。
但是,如果我们假设作者拒绝通过 Maven 发布他们自己的 jar 意味着他们不希望以这种方式分发它们,那么就没有理由花太多时间在这个选项的细节上。所以继续前进...
在 Git Repo
中的分布
我想这就是您正在做的事情,但如果 Maven 分发违反了许可证,我会确保您以正确的方式分裂头发,认为这没有。
所以问题是如何让 Maven 处理以这种方式分发的工件,同样有一些选择。
您反对将 jars 放在本地存储库中,因为它需要用户的额外命令;但实际上这可以在构建的 "validate" 阶段自动完成。将 install:install-file
绑定到验证阶段应该有效。
或者,您反对使用 system
范围的原因是文件未复制到最终 war 中。您也许可以使用依赖插件来强制解决这个问题,但我不确定。我确信您可以将包含 jars 的目录视为在 war 插件中具有适当配置的 Web 资源。 (您希望它被视为未过滤并映射到 WEB-INF/lib
文件夹。)
无论如何,如果您在 git 存储库中分发 jar(或其他大型二进制文件),我强烈建议您查看 git lfs
。这将需要您的每个用户一次性配置,但它会防止您的存储库逐渐变得臃肿和无法使用。
我们有一个 git 项目,其中包含一些第 3 方 jar,这些 jar 在任何 Maven 存储库中都不可用,并且位于项目的 "lib" 文件夹中。我需要将它们包含在编译、构建中,然后将它们打包到 WEB-INF/lib
中的 WAR 中。
我无法从命令行将它们添加为本地 Maven 存储库,因为这个项目需要为任何克隆存储库的人构建,而不需要他们 运行 额外的命令(我无法绕过这个要求) .
我看到有些人建议使用系统作用域,但 Maven 不会将它们打包到您的 WAR:
<dependency>
<groupId>com.roufid.tutorials</groupId>
<artifactId>example-app</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/yourJar.jar</systemPath>
</dependency>
如何让这些 jar 用于 compiling/inspection、构建然后打包到 WAR?
在systemPath中使用正斜杠(/)转反斜杠()。
<dependency>
<groupId>com.roufid.tutorials</groupId>`enter code here`
<artifactId>example-app</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}\lib\yourJar.jar</systemPath>
您可以使用:
- 系统范围,但通过
assembly
插件自行打包 - 与您的项目一起使用的 maven 存储库(即即时的 maven 存储库,与本地存储库基本相同,但无需担心额外的移动部分,因为此存储库遵循您的项目)。
对于 Maven repo on-the-fly 选项,你可以按照描述的那样做 here(也就是说,使用任何已经存在的 Maven repo,它已经包含你需要的 jar,比如你本地的,把它在你的项目中,然后使用相对路径从你的项目中引用这个 repo。
我假设您已经验证了您可能用于分发这些 jar 的任何机制都符合相关许可。如果可以,那么 jars 的创建者 not 似乎没有理由提供官方 Maven 分发,因此您最好的选择可能是游说他们这样做。但如果没有,但出于某种原因,他们将允许您分发 jar(通过克隆您的存储库,或通过您维护的单独的 Maven 存储库):
有几种方法。我更喜欢 不 将罐子放入 git 存储库的方法。
发布 Maven Repo
因此可以托管面向 public 的存储库并以这种方式提供工件。 pom 可以将面向 public 的存储库添加到构建中,这样克隆的人就可以构建而无需 运行 任何特殊命令。
运行 你自己的 repo 并不难。 Nexus 或 Artifactory jFrog 的 OSS 版本可能完全有能力。
但是,如果我们假设作者拒绝通过 Maven 发布他们自己的 jar 意味着他们不希望以这种方式分发它们,那么就没有理由花太多时间在这个选项的细节上。所以继续前进...
在 Git Repo
中的分布我想这就是您正在做的事情,但如果 Maven 分发违反了许可证,我会确保您以正确的方式分裂头发,认为这没有。
所以问题是如何让 Maven 处理以这种方式分发的工件,同样有一些选择。
您反对将 jars 放在本地存储库中,因为它需要用户的额外命令;但实际上这可以在构建的 "validate" 阶段自动完成。将 install:install-file
绑定到验证阶段应该有效。
或者,您反对使用 system
范围的原因是文件未复制到最终 war 中。您也许可以使用依赖插件来强制解决这个问题,但我不确定。我确信您可以将包含 jars 的目录视为在 war 插件中具有适当配置的 Web 资源。 (您希望它被视为未过滤并映射到 WEB-INF/lib
文件夹。)
无论如何,如果您在 git 存储库中分发 jar(或其他大型二进制文件),我强烈建议您查看 git lfs
。这将需要您的每个用户一次性配置,但它会防止您的存储库逐渐变得臃肿和无法使用。