【问题标题】:Building JAR that includes all its dependencies构建包含所有依赖项的 JAR
【发布时间】:2012-04-01 02:38:39
【问题描述】:

这可能是一个非常基本的问题,但恐怕我对 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 中有什么选项可以这样做?

【问题讨论】:

    标签: java ant jar


    【解决方案1】:

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

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

    【讨论】:

    • 顺便说一句,另一个选项“将所需的库打包到生成的 JAR 中”也“大部分时间”都有效。它在清单中添加了一个 Eclipse 生成的钩子,但有时该钩子(我不记得为什么,抱歉)该钩子在我的环境中不起作用,所以我停止使用该选项。看起来像:Rsrc-Main-Class:测试主类:org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
    • 另一个选项使用 one-jar 类加载器,即额外的魔法。初学者不需要额外的魔法。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        以防万一您使用 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?

        【讨论】:

        • Mayur,你的链接失效了
        【解决方案5】:

        您需要依赖清单文件中的类路径属性。这在How to package libraries into my jar using Ant 解释得很好

        【讨论】:

          猜你喜欢
          • 2014-06-08
          • 1970-01-01
          • 1970-01-01
          • 2014-01-08
          • 2015-08-27
          • 1970-01-01
          • 2012-05-13
          • 2020-05-08
          • 2016-03-24
          相关资源
          最近更新 更多