本地jar不包含在类路径中(` system `)

我正在尝试使用maven和eclipse构建我的应用程序。 我依赖于我本地机器上的第三方jar子。 这是我的pom.xml

 sourceforge.net zipdiff 0.4 system C:/gelcap/lib/zipdiff-0.4.jar   log4j log4j 1.2.11  

当我运行mvn:install时会为我的项目创建war文件。 但问题是它不包括zipdiff.jar文件到web-inf / lib文件夹,它只包含下载的文件。 我需要包括从我的本地系统复制文件,但maven忽略它们。 我没有想到为什么maven没有包含系统范围的文件到我的war文件。 请告诉我如何解决这个问题。 提前致谢

对于“系统”范围,容器应该提供人工制品。 来自maven文档 :

提供

这很像compile,但表示您希望JDK或容器在运行时提供依赖性。 例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。 此范围仅在编译和测试类路径中可用,并且不可传递。

[…]

系统

此范围与提供的类似,只是您必须提供明确包含它的JAR。 工件始终可用,不会在存储库中查找。

通过使用系统范围,您向war插件指示容器将提供此依赖关系。 由于这不是您打算做的,最简单的解决方案是将人工制品放在存储库中,如果您有本地maven存储库,或者您自己的内部网上的maven存储库。

install:install-file目标可用于将单个文件(不带POM)安装到本地存储库。 执行此操作后,将依赖关系类型更改为“compile”并删除“systemPath”元素。

在我的日常工作中,我们使用Nexus来管理内部网上的公司范围的存储库。 您可以为自己的人工制品和第三方人工制品分别拥有存储库。 Nexus还充当代理,从外部存储库缓存伪像,加快构建速度。 这意味着只有使用其他repos中不可用的新依赖项的开发人员必须上传 – 之后,所有其他开发人员都可以使用它 – 他们可以从SCM签出并构建,而不必担心依赖项所在的位置。

我没有想到为什么maven没有包含系统范围的文件到我的war文件。 请告诉我如何解决这个问题。

这是设计的, system范围的依赖关系应该按照文档提供。

实际上,我已经写了很多次( 这里 , 这里 , 这里和这里 )应该避免system范围的依赖。 他们大部分时间都是不好的做法,人们滥用它们,而且它们几乎总是带来麻烦而不是好处。

如果您想要“官方”的观点,让我引用依赖范围迷你指南:

  • system :在项目生命周期的某个阶段需要此依赖项,但这是系统特定的。 不鼓励使用此范围:这被认为是一种“高级”function,只有在您真正理解其使用的所有后果时才能使用,如果实际上无法量化则可能非常困难。 根据定义,此范围使您的构建不可移植。 在某些边缘情况下可能是必要的。 系统范围包括元素,该元素指向此依赖项在本地计算机上的物理位置。 因此,它用于指代预期存在于给定本地机器上而不是存储库中的某个工件; 并且其路径可能因机器而异。 systemPath元素可以在其路径中引用环境变量:例如${JAVA_HOME}

因此,不是使用system范围,而是:

  • 通过install:install-file将库添加到本地存储库。 这是一种快速而肮脏的方式来使事情正常工作,如果你是独自一人,它可能是一个选择,但它使你的构建不可移植。
  • 安装并运行Nexus,Archiva或Artifactory等“企业存储库”,并通过deploy:deploy-file添加库。 这是理想的情况。
  • 按照上一个答案中的描述设置基于文件的存储库,并将库放在那里。 如果您没有公司存储库但需要团队合作并且不想牺牲可移植性,那么这是最好的折衷方案。

请停止使用system范围。

尝试将jar安装到本地存储库 。 当它的构建时间在你的本地jar子和更大的存储库中的jar子之间不应该有区别。

只是一个让我眼前一亮的东西:在路径中你正在使用正常的unix风格斜杠/。 Windows对路径使用反斜杠:。 我不知道maven是否能够将这些转换为彼此,所以也许尝试按如下方式输入路径:

C:\软胶囊\ LIB \ zipdiff-0.4.jar

之前没有尝试过这个可能不起作用,你可以改变编译范围吗?

  sourceforge.net zipdiff 0.4 compile C:/gelcap/lib/zipdiff-0.4.jar