是否可以在pom中定义依赖关系,使其具有系统范围但指向多个jar?
我确信这是非常不正统的,然而,我只是想知道这是否可能。如下所示:
<dependency>
<groupId>foo</groupId>
<artifactId>foo</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/foo/*.jar</systemPath>
</dependency>
答案 0 :(得分:13)
据我了解,您正在寻找一种简单的方法来管理本地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 :(得分:8)
首先(我将永远不会重复),不鼓励使用 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,其中我将介绍如何设置基于文件的存储库。
答案 2 :(得分:3)
我从来没有这样做但是根据maven的核心概念,我认为这可能是不可能的,因为每个工件都由一个实体(jar,zip,tar等)表示 。因此,可能无法让多个罐子代表单个工件。
假设Morever system scope依赖项始终可用,并且未在repo中查找。这些应该仅限于jvm或jdk相关的依赖项(现在由jdk提供,但之前可以单独下载)
答案 3 :(得分:0)
我有类似的问题;我使用的专有软件没有公共的Maven存储库,但是打包了将近200个jar。我已经解决了以下问题:
cd /folder
ls *.jar > folder.txt
然后替换folder.txt的每一行
^(.+)$
使用
<dependency><groupId>folder</groupId><artifactId>$1</artifactId><version>1.0</version><scope>system</scope><systemPath>${folder.root}/folder/$1</systemPath></dependency>
将结果复制到您的pom.xml中。