流行方法的问题
您在互联网上找到的大多数答案都建议您要么将依赖项安装到本地存储库中,要么在中指定“系统”范围,并将依赖项与项目源一起分发。但这两种解决方案实际上都是有缺陷的。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>
对于每个具有表单 Maven 组 ID 的项目,在搜索项目时,将在项目目录中包含以下位置:x.y.z
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从文件夹安装到项目存储库,同时自动解析文件名中的所有元数据(groupId,artifactId等)。该脚本还会打印出依赖项 xml,以便您复制粘贴到 .lib
pom
在目标包中包含依赖项
当您创建项目内存储库时,您将解决将项目的依赖项与其源一起分发的问题,但从那时起,项目的目标工件将依赖于未发布的jar,因此当您将其安装到存储库时,它将具有无法解析的依赖项。
为了解决这个问题,我建议将这些依赖项包含在目标包中。您可以使用汇编插件或更好的OneJar插件执行此操作。OneJar上的官方文件很容易掌握。