2010-08-16 62 views
10

是否有可能在pom中定义依赖关系,使其具有系统范围但指向多个罐子?Maven:指向多个罐子的系统依赖关系

我确定这是非常不正统的,但是,我只是想知道这是否可能。因此,像:

<dependency> 
    <groupId>foo</groupId> 
    <artifactId>foo</artifactId> 
    <version>1.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/foo/*.jar</systemPath> 
</dependency> 

回答

7

首先(我永远不会再说一遍就够了),使用system范围的依赖关系是除非你确切地知道你在做什么,否则不鼓励。从Dependency Scopes

系统:这种关系需要在你的 项目生命周期的某些阶段,但 系统特定的。 使用此范围 是不鼓励:这被认为是 “先进”之类的功能,应该 当你真正了解 所有其使用的后果, 它是非常难,如果不 实际上不可能只使用量化。 此范围的定义使您的 构建不可移植。在某些边缘情况下可能需要 。系统范围包括 <systemPath>元素,该元素指向 这个 依赖于本地机器的物理位置。它是 因此用于指某些工件 预计将出现在给定的 本地机器不在存储库中; ,其路径可能不同 机器对机器。例如,systemPath 元素可以参考其路径中的变量:${JAVA_HOME}

现在,要严格回答你的问题,宣告了system范围,将点上几罐的依赖是“可能” IF的依赖有MANIFEST.MF列出其他JAR相对其Class-Path条目。像这样(假设“根”的依赖是lib):

Class-Path: ../lib/bar.jar ../lib/foo.jar 

,但我不推荐这种方法,尤其是在你的具体情况。相反,看看这个previous answer,我介绍如何设置一个基于文件的存储库。

3

我从来没有这样做,但根据Maven的核心概念,我想是因为每一个神器是由一个单一的实体(罐,拉链,焦油等为代表它可能无法。)。因此可能不可能有多个罐子代表一个人工制品。

更多system scope依赖关系假定始终可用并且不在回购中查找。这些应该仅限于JVM或JDK相关的依赖关系(现在由JDK提供的,但前面是可单独下载)

8

据我所知,您正在寻找一种简单的方法来管理本地jar文件(位于您的案例的'$ {basedir}/lib/foo /'文件夹中)。 使用addjars-maven-plugin很简单。只需添加以下声明到您的POM:

<plugin> 
    <groupId>com.googlecode.addjars-maven-plugin</groupId> 
    <artifactId>addjars-maven-plugin</artifactId> 
    <version>1.0.2</version> 
    <executions> 
    <execution> 
     <goals> 
      <goal>add-jars</goal> 
     </goals> 
     <configuration> 
      <resources> 
       <resource> 
        <directory>${basedir}/lib/foo</directory> 
       </resource> 
      </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+1

很酷的插件。谢谢 – ufk 2012-08-05 09:02:21

+2

addjars-maven-plugin需要Maven版本3.0。 – SKR 2012-09-25 06:45:03