创建用于Maven程序集中依赖项的Symlink

use*_*939 5 dependencies maven maven-assembly-plugin

我有一个Maven程序集,在解压缩tar之后,创建三个目录,每个目录包含一个/ lib目录。所以例如

folder1/lib
folder2/lib
folder3/lib
Run Code Online (Sandbox Code Playgroud)

目前,我在每个/ lib目录中都包装了一个相同的.jar。由于这是浪费空间,我想知道我是否只能拥有该.jar的一个副本,并为其他两个可以引用该.jar的位置创建类似符号链接的内容?

谢谢!

Rob*_*Rob 2

我相信 Maven 打包和组装不支持这一点。 一年前的另一个 Stack Overflow 问题也提出了同样的问题,并得到了“不受支持”的答案。并且(至少)有两个关于此功能的 JIRA 已经开放了相当长一段时间:一个用于程序集插件另一个用于 Plexus 组件。我想说的是,直接支持的可能性并不大。

仅供参考,如果我说“源项目”,我将指的是组装 tar.gz 文件的项目。如果我说“目标项目”,我指的是解压焦油的项目。这是假设您双方都有 Maven 项目 - 如果这个假设是错误的,您应该依靠命令行实用程序来为您进行 tar 压缩或解压缩。

因为在我看来您是在 Maven 构建的上下文中解压 tar,所以有一些方法可以解决这个问题。据我所知,如果符号链接对您很重要,最好的解决方案是使用junction plugin、 exec-maven-plugin 或 maven-antrun-plugin 。

junction 插件的优点是可移植,即使在 Windows 上也是如此。问题是进行解包的项目必须明确了解 tar 原始结构的结构,这通常是不可取的,因为如果预期的符号链接发生更改,则必须对其进行更新。该插件似乎也相当缺乏维护,所以就是这样。

exec 插件将允许您调用命令行实用程序或脚本来进行链接,但您必须使用配置文件才能获得跨平台功能。这样做的最大好处是进行解包的项目完全不知道 tar 的原始结构。具体机制的细节就在我上面提到的一年前的问题中。

对于我的项目,我可能会使用 antrun 来执行 Ant 的符号链接任务- 可以让 Ant 将所有符号链接记录到源端的文件中,然后将该文件与 Maven 一起打包。然后,接收项目可以检查该文件并重新创建其符号链接。这允许从源项目更改用于 tar 分发的符号链接,而无需对目标项目进行任何更改。我的项目仅支持 OS X 和 Linux,因此这是可以接受的 - 您需要决定哪个最适合您。

无论哪种情况,您都会不幸地遇到这样的情况:进行解包的项目必须了解 tar 在打包之前的情况。