如何在程序集JAR中添加本地依赖项

时间:2013-12-22 20:01:49

标签: maven build jar maven-assembly-plugin

我有一个包含多个依赖项的多模块Maven项目。我想构建一个包含它们的 fat <​​/ em>可执行文件JAR以及我自己编译的类。我发现maven-assembly-plugin只是我需要的东西,除了一个令人讨厌的问题。

我的一些依赖项是本地的,并与项目源一起分发。我为它们使用system范围。它看起来像这样:

<dependency>
    <groupId>com.intellij</groupId>
    <artifactId>forms_rt</artifactId>
    <version>1</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/forms_rt.jar</systemPath>
</dependency>

问题在于,出于某种原因这些库未在结果JAR中解包并与其余的依赖项捆绑在一起。

我知道system范围的使用被认为是不好的做法,事实上我甚至可以在Maven资源库中找到一些(虽然已经过时了),但无论如何它让我很困惑如何用maven-assembly-plugin解决它。

以防我的插件配置如下:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>repoll.server.Repoll</mainClass>
            </manifest>
        </archive>
        <finalName>${project.build.finalName}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

据我所知,我必须编写自定义描述符,例如包括并解压缩${project.basedir}/lib目录中的所有JAR,但经过多次尝试失败后,我仍然不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

我在这里找到了解决方案。它在this question中描述。

简而言之,整个问题是使用system范围。事实证明,默认情况下会过滤掉这种依赖关系,我通过在启用调试输出(mvn package)的情况下运行-X/--debug来发现这种依赖关系。 当为这些JAR定义本地存储库,与项目一起分发时,它们将被maven-assembly-plugin解压缩。