Maven 2 在实验/快速而肮脏的开发模型阶段让我发疯。
我有一个 pom.xml
文件,它定义了我想要使用的 Web 应用程序框架的依赖项,我可以从该文件快速生成入门项目。但是,有时我想链接到尚未定义 pom.xml
文件的第 3 方库,因此,我不想手动为第 3 方库创建 pom.xml
文件并安装它,并将依赖项添加到我的 pom.xml
中,而是想告诉 Maven:“除了我定义的依赖项之外,还包括 /lib
中的任何 jar。”
看起来这应该很简单,但如果是的话,我就错过了一些东西。
非常感谢任何有关如何执行此操作的指示。除此之外,如果有一种简单的方法将 maven 指向 /lib
目录并轻松创建一个 pom.xml
,其中所有封闭的 jar 都映射到单个依赖项,然后我可以一次性命名/安装并链接到该依赖项也足够了。
最佳答案
流行方法的问题
您在互联网上找到的大多数答案都会建议您将依赖项安装到本地存储库,或者在 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
要详细说明这一点,您可以阅读 this blog post .
使用 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>
帮助脚本
由于为每个库执行安装命令有点烦人并且肯定容易出错,因此我创建了一个 utility script它将自动将 lib 文件夹中的所有 jar 安装到项目存储库,同时自动从文件名称解析所有元数据(groupId、artifactId 等)。该脚本还会打印出依赖项 xml,供您复制粘贴到您的 pom
中。
在目标包中包含依赖项
当您创建项目内存储库时,您将解决了分配项目及其源的依赖项的问题,但从那时起您的项目的目标工件将依赖于未发布的 jar,因此当您将其安装到存储库时,它将具有无法解析的依赖项。
为了解决这个问题,我建议将这些依赖项包含在您的目标包中。您可以使用 Assembly Plugin 来完成此操作。或更好地使用 OneJar Plugin 。 OneJar 的官方文档很容易掌握。
关于java - 我可以将 jar 添加到 Maven 2 构建类路径而不安装它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34083679/