我可以在不安装的情况下将 jar 添加到 Maven 2 构建类路径吗?

新手上路,请多包涵

Maven 2 在开发的实验/快速而肮脏的模型阶段让我发疯。

我有一个 pom.xml 文件,它定义了我要使用的网络应用程序框架的依赖项,我可以从该文件快速生成启动项目。但是,有时我想链接到尚未定义 pom.xml 文件的第三方库,而不是手动为第三方库创建 pom.xml 文件和安装它,并将依赖项添加到我的 pom.xml 中,我只想告诉 Maven:“除了我定义的依赖项之外,还包括 /lib 中的所有 jar。”

看起来这应该很简单,但如果是这样,我就错过了一些东西。

非常感谢有关如何执行此操作的任何指示。除此之外,如果有一种简单的方法可以将 maven 指向 /lib 目录并轻松创建一个 pom.xml 并将所有随附的 jar 映射到一个依赖项,然后我可以将其命名为 /一口气安装并链接到也足够了。

原文由 purple 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 328
1 个回答

流行方法的问题

您在互联网上找到的大多数答案都会建议您将依赖项安装到本地存储库或在 pom 中指定一个“系统”范围,然后将依赖项与您的项目源一起分发。但这两种解决方案实际上都存在缺陷。

为什么不应该应用“安装到本地回购”方法

当您将依赖项安装到本地存储库时,它会保留在那里。只要您的分发工件可以访问此存储库,它就可以正常工作。问题是在大多数情况下,这个存储库将驻留在您的本地计算机上,因此无法解决对任何其他计算机的这种依赖性。很明显,让你的工件依赖于特定的机器并不是一种处理事情的方法。否则,必须在使用该项目的每台机器上本地安装此依赖项,这不会更好。

为什么不应该应用“系统范围”方法

您依赖于“系统范围”方法的 jar 既不会安装到任何存储库也不会附加到您的目标包。这就是为什么您的分发包在使用时无法解决该依赖关系的原因。我相信这就是系统范围的使用甚至被弃用的原因。无论如何,您不想依赖已弃用的功能。

静态项目内存储库解决方案

将其放入您的 pom 之后:

 <repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

对于每个组 ID 为 x.y.z 的工件,Maven 将在您的项目目录中包含以下位置以搜索工件:

 repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

要详细说明这一点,您可以阅读 这篇博文

使用 Maven 安装到项目仓库

我建议不要手动创建此结构,而是使用 Maven 插件将您的 jar 安装为工件。因此,要将工件安装到 repo 文件夹下的项目内存储库,请执行:

 mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

如果您选择这种方法,您将能够将 pom 中的存储库声明简化为:

 <repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

帮助脚本

由于为每个库执行安装命令有点烦人而且绝对容易出错,我创建了一个 实用程序脚本,它自动将所有 jar 从 lib 文件夹安装到项目存储库,同时自动解析所有元数据(groupId , artifactId 等)来自文件名。该脚本还打印出依赖项 xml,供您复制粘贴到您的 pom 中。

在目标包中包含依赖项

当您创建项目内存储库时,您将解决一个问题,即分发项目及其源的依赖项,但从那时起,您的项目的目标工件将依赖于未发布的 jar,因此当您安装它到一个存储库,它将具有无法解析的依赖关系。

为了解决这个问题,我建议将这些依赖项包含在目标包中。您可以使用 Assembly Plugin 或更好的 OneJar Plugin 来做到这一点。 OneJar 上的官方文档很容易掌握。

原文由 Nikita Volkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题