流行方法的问题
在互联网上找到的大多数答案都建议您将依赖项安装到本地存储库中,或在 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的工件,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>
辅助脚本
由于对每个库执行安装命令有点烦人并且绝对容易出错,因此我创建了一个实用程序脚本,该脚本会自动将lib
文件夹中的所有jar都安装到项目存储库中,同时会自动从中解析所有元数据(groupId,artifactId等)。文件名。该脚本还会打印出依赖项xml,供您复制粘贴到pom
。
在目标包中包含依赖项
创建项目内存储库后,将解决分配项目及其源代码的依赖关系的问题,但是从那时起,项目的目标工件将依赖于未发布的jar,因此在安装时它到存储库中,它将具有无法解决的依赖关系。
为了解决这个问题,我建议在目标软件包中包括这些依赖项。您可以使用Assembly插件,也可以使用OneJar插件更好地做到这一点。OneJar上的官方文档很容易掌握。