【问题标题】:Create Symlink for dependencies in Maven assembly在 Maven 程序集中为依赖项创建符号链接
【发布时间】:2014-05-16 19:26:02
【问题描述】:

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

folder1/lib
folder2/lib
folder3/lib

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

谢谢!

【问题讨论】:

    标签: maven dependencies maven-assembly-plugin


    【解决方案1】:

    对于非常相似的情况,这是我使用maven-antrun-plugin 的解决方案。 Zookeeper 依赖项以前由maven-dependency-plugin 放入${basedir}/target/package/lib。现在我正在为所有库创建符号链接到${basedir}/target/package/lib/zookeeper/lib,它指向2个目录。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
            <execution>
                <id>prepare-delivery</id>
                <phase>package</phase>
                <goals>
                    <goal>run</goal>
                </goals>
                <configuration>
                    <target>
                        <!-- Prepare zookeeper layout. -->
                        <mkdir dir="${basedir}/target/package/lib/zookeeper/lib"/>
                        <apply executable="ln" dir="${basedir}/target/package/lib/zookeeper/lib" relative="true">
                            <arg value="-s"/>
                            <srcfile prefix="../../"/>
                            <targetfile/>
                            <fileset dir="${basedir}/target/package/lib" includes="**"/>
                            <mapper type="identity"/>
                        </apply>
                    </target>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    antrun的插件管理设置如下:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
    </plugin>
    

    【讨论】:

    • 是否可以使用不同的名称创建符号链接?在 target/dist 目录中,我有我的 artifact-version.jar。我需要在 target/dist 目录中创建一个名为 artifact.jar 的符号链接,该链接指向 artifact-version.jar。有可能吗?
    • 我已经超过 2 年没有使用 maven 了,但即使在回答之日,这当然是可能的。只需检查 antrun 插件文档。顺便说一句,这个“应用”任务太通用了,它几乎可以运行任何东西,而且现在它可能更优雅了。对 Maven 这类 hack 的持续需求是我从 Maven 迁移到 Gradle 的主要原因。
    • 谢谢!我找到了一种使用符号链接任务的方法。
    【解决方案2】:

    我相信这在 Maven 打包和组装中不受支持。 Another Stack Overflow question from just a year ago asked the same thing 并得到“不支持”的答案。并且(至少)有两个关于此功能的 JIRA 已经开放了很长时间:one for the assembly pluginone for Plexus components。我想说的是,这种被直接支持的可能性并不大。

    仅供参考,如果我说“源项目”,我将指的是组装 tar 的项目。如果我说“目标项目”,我指的是解包焦油的项目。这是假设您在双方都有 Maven 项目 - 如果该假设是错误的,您应该依靠命令行实用程序为您执行 tar-ing 或 untar-ing。

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

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

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

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

    在任何一种情况下,不幸的是,您都会遇到这样一种情况,即进行解包的项目必须了解 tar 在打包之前的方式。

    【讨论】:

    【解决方案3】:

    您可以使用 ant-run 插件的符号链接任务/目标

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
        <executions>
            <execution>
                <phase>package</phase>
                <configuration>
                    <target>
                        <symlink link="folder2/lib/${project.artifactId}-${project.version}.jar"
                                 resource="folder1/lib/${project.artifactId}-${project.version}.jar"/>
                        <symlink link="folder3/lib/${project.artifactId}-${project.version}.jar"
                                 resource="folder1/lib/${project.artifactId}-${project.version}.jar"/>
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    如果您希望符号链接具有相对路径,您可以在资源中提供相对路径,如下所示

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.8</version>
        <executions>
            <execution>
                <phase>package</phase>
                <configuration>
                    <target>
                        <symlink link="folder2/lib/${project.artifactId}-${project.version}.jar"
                                 resource="../../folder1/lib/${project.artifactId}-${project.version}.jar"/>
                        <symlink link="folder3/lib/${project.artifactId}-${project.version}.jar"
                                 resource="../../folder1/lib/${project.artifactId}-${project.version}.jar"/>
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

      猜你喜欢
      • 2012-11-16
      • 2010-11-05
      • 2014-04-25
      • 2011-11-29
      • 2016-03-12
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多