如何使用maven和fatjar插件将一个SINGLE依赖项包含到jar中

时间:2012-07-11 19:39:13

标签: maven uberjar

我觉得这个问题有点愚蠢,但我无法弄清楚如何将SINGLE依赖(jdom.jar)添加到另一个jar中。

上下文:我们为我们的应用程序开发了一个简单的插件,这个插件有很多依赖。我们使用fatjar将jdom.jar包含在其中。我正在尝试修复此插件中的错误,所以我决定同时“maven-ize”。 (我们刚刚切换到maven)这个插件加载到运行时,因此我们想要打包的唯一依赖项是jdom.jar。

问题:我发现有一个maven fatjar插件!不幸的是我找不到任何文档,这个maven插件将每个依赖项添加到输出jar中。经过多次尝试,我决定放弃这个fatjar插件并搜索另一个插件。我找到了一个罐子,阴影,但在快速读取它们后,它们看起来像是添加了每个依赖。

问题:将jdom.jar添加到我的插件jar中的简单方法是这样的:

-MyPlug-in.jar
|
|-src
 |-main
  |-java
   |-*.java
|-jdom.jar

此外,我不想更改清单或输出jar文件名

非常感谢你的时间。

3 个答案:

答案 0 :(得分:13)

这里没有关于如何使用maven包含一个带有maven-shader-plugin的jar文件的答案。我花了一些时间来弄清楚如何真正做到这一点。以下是仅包含依赖项com.googlecode.json-simple:json-simple中的类的代码段。

<project>
    ...
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <includes>
                                   <include>com.googlecode.json-simple:json-simple</include>
                                </includes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
    </build>
    ...
</project>

答案 1 :(得分:1)

使用maven Shade工作正常,一罐也可以完成这项工作。 但我们最终决定在我们的扩展中包装jdom是一种不好的做法。

所以相反我们会这样做:

|-Root application Folder
 |-Extension Folder
  |-MyExtension.jar
  |-libs Folder
   |-jdom.jar

如果扩展程序无法在libs文件夹中找到相应的库,则会动态加载进入lib文件夹的jar文件夹。

对于希望解决我的主要问题的人,请查看@khmarbaise答案。

答案 2 :(得分:0)

出于这种目的,我建议使用maven-shade-plugin来创建一个可以通过多种方式控制的ueber-jar。 使用您不喜欢的shade plugin you can exclude things。但这可能是因为没有使用单独的maven模块来控制依赖关系。