类路径中不包含本地jar(`< scope> system< / scope>`)

| 我正在尝试使用maven和eclipse构建我的应用程序。 我依赖于我本地机器上的第三方罐子。 这是我的pom.xml
<dependency>
    <groupId>sourceforge.net</groupId>
   <artifactId>zipdiff</artifactId>
   <version>0.4</version>
   <scope>system</scope>
   <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath>
</dependency>

<dependency>
    <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.11</version>
</dependency>
当我运行mvn:install时会为我的项目创建war文件。 但问题是它不包括zipdiff.jar文件到web-inf / lib文件夹,它只包含下载的文件。我需要包括从我的本地系统复制文件,但maven忽略它们。 我没有想到为什么maven没有包含系统范围的文件到我的war文件。 请告诉我如何解决这个问题。 提前致谢     
已邀请:
对于“系统”范围,容器预计将提供人工制品。来自maven文档:   提供      这很像编译,但表示你期望JDK或   容器提供依赖关系   运行。例如,建立一个   Java的Web应用程序   企业版,你会设置   依赖于Servlet API和   提供的相关Java EE API   因为Web容器提供   那些课程。这个范围只是   可用于编译和测试   classpath,并且不是传递的。      [...]      系统      此范围与提供的类似,但您必须这样做   提供包含它的JAR   明确。工件总是如此   可用,并没有查找   库。 通过使用系统范围,您向war插件指示容器将提供此依赖关系。由于这不是您打算做的,最简单的解决方案是将人工制品放在存储库中,如果您有本地maven存储库,或者您自己的内部网上的maven存储库。 install:install-file目标可用于将单个文件(不带POM)安装到本地存储库。执行此操作后,将依赖关系类型更改为“compile”并删除“systemPath”元素。 在我的日常工作中,我们使用Nexus来管理内部网上的公司范围的存储库。您可以为自己的人工制品和第三方人工制品分别拥有存储库。 Nexus还充当代理,从外部存储库缓存伪像,加快构建速度。这意味着只有使用其他repos中不可用的新依赖项的开发人员必须上传 - 之后,所有其他开发人员都可以使用它 - 他们可以从SCM签出并构建,而不必担心依赖项所在的位置。     
我没有想到为什么maven没有包含系统范围的文件到我的war文件。请告诉我如何解决这个问题。 这是设计的,
system
范围的依赖关系应该按照文档提供。 实际上,我已经多次写过(这里,这里,这里和这里)应该避免使用
system
范围的依赖。他们大部分时间都是一种不好的做法,人们滥用它们,而且它们几乎总是带来麻烦而不是好处。 如果您想要“官方”的观点,让我引用依赖范围迷你指南:      
system
:在项目生命周期的某个阶段需要这种依赖关系,但这是系统特定的。不鼓励使用此范围:这被认为是一种“高级”功能,只有在您真正理解其使用的所有后果时才能使用,如果实际上无法量化则可能非常困难。根据定义,此范围使您的构建不可移植。在某些边缘情况下可能是必要的。系统范围包括
<systemPath>
元素,该元素指向此依赖关系在本地计算机上的物理位置。因此,它用于指代预期存在于给定本地机器上而不是存储库中的某个工件;并且其路径可能因机器而异。 systemPath元素可以在其路径中引用环境变量:例如,
${JAVA_HOME}
。    因此,不是使用
system
范围,而是: 通过
install:install-file
将库添加到本地存储库。这是一种快速而肮脏的方式来使事情正常工作,如果你是一个人,它可能是一个选项,但它使你的构建不可移植。 安装并运行像Nexus,Archiva或Artifactory这样的“企业存储库”,并通过
deploy:deploy-file
添加您的库。这是理想的情况。 按照上一个答案中的描述设置基于文件的存储库,并将库放在那里。如果您没有公司存储库但需要团队合作并且不想牺牲可移植性,那么这是最好的折衷方案。 请停止使用
system
范围。     
尝试将jar安装到本地存储库。当它的构建时间在你的本地罐子和更大的存储库中的罐子之间不应该有区别。     
只是一件让我眼前一亮的事: 在路径中,您使用的是普通的unix样式斜杠/。 Windows对路径使用反斜杠:。 我不知道maven是否能够将它们相互转换,所以可以尝试按如下方式输入路径:   C:软胶囊 LIB zipdiff-0.4.jar     
之前没有尝试过这个可能不起作用,你可以改变编译范围吗?
<dependency>
   <groupId>sourceforge.net</groupId>
   <artifactId>zipdiff</artifactId>
   <version>0.4</version>
   <scope>compile</scope>
   <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath>
</dependency>
    

要回复问题请先登录注册