我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)
当我运行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存储库.
该安装:安装文件的目标,可以用来安装一个单独的文件(不POM)到本地资源库.执行此操作后,将依赖关系类型更改为"compile"并删除"systemPath"元素.
在我的日常工作中,我们使用Nexus来管理内部网上的公司范围的存储库.您可以为自己的人工制品和第三方人工制品分别拥有存储库.Nexus还充当代理,从外部存储库缓存伪像,加快构建速度.这意味着只有使用其他repos中不可用的新依赖项的开发人员必须上传 - 之后,所有其他开发人员都可以使用它 - 他们可以从SCM签出并构建,而不必担心依赖项所在的位置.
我没有想到为什么maven没有包含系统范围的文件到我的war文件.请告诉我如何解决这个问题.
这是设计的,system应该按照文档提供范围的依赖关系.
实际上,我已经写了很多次(这里,这里,这里和这里)system应该避免使用范围的依赖.他们大部分时间都是一种不好的做法,人们滥用它们,而且它们几乎总是带来麻烦而不是好处.
如果您想要"官方"的观点,让我引用依赖范围迷你指南:
system:在项目生命周期的某个阶段需要此依赖项,但这是系统特定的.不鼓励使用此范围:这被认为是一种"高级"功能,只有在您真正理解其使用的所有后果时才能使用,如果实际上无法量化则可能非常困难.根据定义,此范围使您的构建不可移植.在某些边缘情况下可能是必要的.系统范围包括<systemPath>指向此依赖关系在本地计算机上的物理位置的元素.因此,它用于指代预期存在于给定本地机器上而不是存储库中的某个工件; 并且其路径可能因机器而异.systemPath元素可以在其路径中引用环境变量:${JAVA_HOME}例如.
因此,不是使用system范围,而是:
install:install-file.这是一种快速而肮脏的方式来使事情正常工作,如果你是一个人,它可能是一个选项,但它使你的构建不可移植.deploy:deploy-file.这是理想的情况.请停止使用system示波器.
| 归档时间: |
|
| 查看次数: |
6876 次 |
| 最近记录: |