Java 本地JAR不包括在类路径中(`<;scope>;system<;/scope>;`)

Java 本地JAR不包括在类路径中(`<;scope>;system<;/scope>;`),java,maven-2,Java,Maven 2,我正在尝试使用maven和eclipse构建我的应用程序。 我依赖于本地机器上的第三方JAR。 这是我的pom.xml <dependency> <groupId>sourceforge.net</groupId> <artifactId>zipdiff</artifactId> <version>0.4</version> <scope>system</scope&g

我正在尝试使用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>

sourceforge.net
齐普迪夫
0.4
系统
C:/gelcap/lib/zipdiff-0.4.jar
log4j
log4j
1.2.11
当我运行mvn:install时,它会为我的项目创建war文件。 但问题是它没有将zipdiff.jar文件包含到web inf/lib文件夹中,它只包含下载的文件。我还需要包括从本地系统复制文件,但maven会忽略它们。 我没有想到为什么maven没有在我的war文件中包含具有系统作用域的文件。 请告诉我如何解决这个问题。 提前感谢具有“系统”范围的容器,该容器有望提供人工制品。从:

提供

这与compile非常相似,但表示您希望使用JDK或 提供依赖项的容器 运行时。例如,在构建 Java的web应用程序 企业版,您可以设置 对Servlet API和 与提供的作用域相关的JavaEEAPI 因为web容器提供 那些课。此范围仅适用于 可在编译和测试中获得 类路径,并且不是可传递的

[……]

系统

此范围与提供的类似,只是您必须 提供包含它的JAR 明确地人工制品总是 可用,并且未在中查找 存储库

通过使用系统作用域,您向war插件指示容器将提供此依赖关系。因为这不是您想要做的,所以最简单的解决方案是将人工制品放在存储库中,或者放在您本地的maven存储库中,或者放在您的intranet上您自己的maven repo中(如果您有)

该目标可用于将单个文件(不带POM)安装到本地存储库中。完成此操作后,将依赖项类型更改为“compile”,并删除“systemPath”元素


在我的日常工作中,我们用来管理公司内部网上的存储库。与第三方人工制品相比,您可以拥有单独的人工制品存储库。Nexus还充当代理,缓存来自外部存储库的人工制品,大大加快了构建速度。这意味着,只有使用其他repo中不可用的新依赖项的开发人员必须上传—之后,所有其他开发人员都可以使用它—他们可以从SCM中签出并构建,而不必担心依赖项位于何处。

这是一件让我印象深刻的事情: 在使用普通unix样式的斜杠/的路径中。Windows对路径使用反斜杠:。 我不知道maven是否能够将它们相互转换,因此可以尝试按如下方式输入路径:

C:\gelcap\lib\zipdiff-0.4.jar


试试看。在构建时,本地JAR和更大存储库中的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>

sourceforge.net
齐普迪夫
0.4
编译
C:/gelcap/lib/zipdiff-0.4.jar
我没有想到为什么maven没有在我的war文件中包含具有系统作用域的文件。请告诉我如何解决这个问题

这是设计上的,
系统
范围内的依赖项应该提供为

实际上,我已经写了很多次(,和)应该避免
system
范围依赖。大多数时候,它们是一种不好的做法,人们正在滥用它们,它们产生的麻烦几乎总是多于好处

如果你想了解“官方”观点,请允许我引用迷你指南:

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

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

请停止使用
系统
作用域。

你好,Allain,我已将jar文件安装到本地maven存储库,但当我运行目标maven:install表单eclipse时,它仍然没有将jar复制到web inf/lib文件夹。我做了以下步骤:1。运行以下命令mvn install:install file-DgroupId=sourceforge.net-DartifactId=zipdiff-Dversion=0.4-Dfile=C:/gelcap/lib/zipdiff-0.4.jar-dpackage=jar-Dgenera