java本地JAR不包括在类路径中(`<scope>system</scope>`)
我正在尝试使用maven和eclipse构建我的应用程序。 我依赖于本地机器上的第三方JAR。 这是我的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文件中包含具有系统作用域的文件。 请告诉我如何解决这个问题。 提前谢谢
# 1 楼答案
只是一件触动我眼睛的事: 在路径中,您使用的是普通unix样式的斜杠/。Windows对路径使用反斜杠:。 我不知道maven是否能够将它们相互转换,所以可以尝试如下输入路径:
# 2 楼答案
试试installing the jars to your local repository。在构建时,本地JAR和更大的存储库中的JAR之间应该没有区别
# 3 楼答案
这是在设计上,
system
范围内的依赖项应该作为documented提供事实上,我已经写了很多次(here、here、here和here)应该避免
system
范围的依赖关系。大多数情况下,它们是一种不好的做法,人们正在虐待它们,它们产生的麻烦几乎总是多于好处如果你想要一个“官方”的观点,让我引用Dependency Scopes迷你指南:
因此,与其使用
system
范围,不如:install:install-file
将库添加到本地存储库。这是一种快速而肮脏的工作方式,如果你独自一人,这可能是一种选择,但它会使你的构建不可移植李>deploy:deploy-file
添加库。这是理想的情况李>请停止使用
system
范围# 4 楼答案
在“系统”范围内,容器有望提供人工制品。从maven docs开始:
通过使用系统作用域,您向war插件指示容器将提供这种依赖关系。由于这不是您打算做的,最简单的解决方案是将人工制品放在存储库中,可以是您的本地maven存储库,也可以是您自己的内部网maven repo(如果您有)
可以使用install:install-file目标将单个文件(不带POM)安装到本地存储库中。完成此操作后,将依赖项类型更改为“compile”,并删除“systemPath”元素
在我的日常工作中,我们使用Nexus来管理公司内部网上的一个公司范围的存储库。您可以为自己的人工制品和第三方人工制品建立单独的存储库。Nexus还充当代理,缓存外部存储库中的人工制品,大大加快了构建速度。这意味着,只有使用其他REPO中不可用的新依赖项的开发人员必须上传——之后,所有其他开发人员都可以使用它——他们可以从SCM中签出并构建,而不必担心依赖项位于何处
# 5 楼答案
因为之前没有尝试过这个方法,所以它可能无法工作,您可以更改编译的范围吗