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

时间:2010-07-19 12:01:36

标签: java maven-2

我正在尝试使用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文件。 请告诉我如何解决这个问题。 提前致谢

5 个答案:

答案 0 :(得分:7)

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

  

提供

     

这很像编译,但表示你期望JDK或者   容器提供依赖关系   运行。例如,建立一个   Java的Web应用程序   企业版,你会设置   依赖于Servlet API和   提供的相关Java EE API   因为Web容器提供   那些课程。这个范围只是   可用于编译和测试   classpath,并且不是传递的。

     

[...]

     

系统

     

此范围与您提供的内容类似   提供包含它的JAR   明确。工件总是如此   可用,并没有查找   库中。

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

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

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

答案 1 :(得分:6)

  

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

这是设计的,system范围的依赖关系应该被提供为documented

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

如果你想要一个“官方”的观点,让我引用Dependency Scopes迷你指南:

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

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

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

请停止使用system范围。

答案 2 :(得分:1)

试试installing the jars to your local repository。当它的构建时间在你的本地罐子和更大的存储库中的罐子之间不应该有区别。

答案 3 :(得分:0)

只是一件让我眼前一亮的事: 在路径中,您使用的是普通的unix样式斜杠/。 Windows对路径使用反斜杠:。 我不知道maven是否能够将这些转换成彼此,所以也许尝试按如下方式输入路径:

  

C:\软胶囊\ lib中\ zipdiff-0.4.jar

答案 4 :(得分:0)

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

<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>