构建包含其所有依赖项的JAR

时间:2012-03-15 14:51:51

标签: java ant jar

这可能是一个非常基本的问题,但我担心我对Java知之甚少,而且无法在任何地方找到答案。

我正在尝试构建一个依赖于TFS SDK的Ant库。我跟着the guide建立了一个项目,但当我将它导出为JAR并尝试使用ANT运行任务时,我收到以下错误:

java.lang.NoClassDefFoundError: /com/microsoft/tfs/core/util/TFSUser

我意识到我可以将TFS SDK JAR放在我的ANT lib文件夹中,但是如果可能的话,我希望我的JAR能够包含它并且库可以正常工作而不必这样做。

This answer似乎说可以包含使用Eclipse运行所需的所有资源(我正在使用3.7.2),但它没有详细说明如何实际执行此操作。 Eclipse中有什么选项可以这样做?

5 个答案:

答案 0 :(得分:3)

在导出时选择“将所需库提取到生成的JAR中”。

Extract required libraries into generated JAR

在导出时选择“将所需库提取到生成的JAR中”。

答案 1 :(得分:3)

使用文件 - >出口 - > Java - >可运行的JAR文件,而不是Eclipse。

“将所需的库提取到生成的JAR中”应该是您所需要的。

答案 2 :(得分:1)

当你构建一个jar时,你会得到一个只包含你的代码的JAR,而不是你需要的任何依赖项。您可以使用类似jarjar的内容将所有依赖项合并到一个易于管理的Jar文件中,或将所有依赖JAR复制到一个文件夹中以便于使用。看起来Eclipse也有选择来做这种事情(见上面的帖子)。

另一种选择是使用依赖关系管理系统,例如MavenIvy。这有一个更高的学习曲线,但对于一个库来说它是值得的,因为它将允许您的库的用户轻松获取所有依赖项。对于最终用户应用程序,单个可分发可能是更好的选择(您可以使用Maven或Ivy在内部管理依赖项,然后使用jarjar或Java Web Start分发给最终用户)。

答案 3 :(得分:0)

您需要依赖清单文件中的classpath属性。这在How to package libraries into my jar using Ant

中得到了很好的解释

答案 4 :(得分:0)

以防你是否正在使用maven。您需要包含以下插件。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <properties>
            <property>
                <name>listener</name>
                <value>com.example.TestProgressListener</value>
            </property>
        </properties>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

了解更多@ how do I build JAR file with dependencies?