【问题标题】:Minimizing jar dependency sizes最小化 jar 依赖大小
【发布时间】:2011-04-18 13:48:24
【问题描述】:

我编写的一个应用程序使用了几个第三方 jar。有时只使用整个 50kB 到 1.7mB jar 中的一小部分——一两个函数调用或类。

减小罐子尺寸的最佳方法是什么。我应该下载源代码并用我需要的类构建一个 jar 吗?现有的哪些工具可以帮助实现这一点(例如我简要地查看了http://code.google.com/p/jarjar/)?

谢谢

编辑 1: 我想减小我的第三方“官方”罐子的大小,如 swingx-1.6.jar (1.4 MB)、set-3.6 (1.7 MB) glazedlists-1.8.jar (820kB) 等,以便它们只包含我需要的最低限度的课程

编辑 2: 如果库使用反射,则手动或使用 proguard 之类的程序最小化 jar 会更加复杂。 Injection with google guice does not work anymore after obfuscation with proguard

cletus在另一个帖子的回答非常好How to determine which classes are used by a Java program?

【问题讨论】:

    标签: java jar dependencies utility


    【解决方案1】:

    Proguard 将是一个选项。它可以消除未使用的类和方法。您还可以使用它来混淆,这可以进一步减小最终 jar 的大小。请注意,除非注意保持受影响的类不被混淆,否则按名称加载类可能会中断。

    我发现 Proguard 非常有效 - 一开始可能有点难以理解。但是我没有任何类似的经验来提供比较。

    【讨论】:

    • 我使用 Proguard 对我的应用程序 jar 进行了混淆处理,效果很好,并且注意到输出大小更小。正如您提到的,我还遇到了与 xstream 对象有关的“损坏的类”问题,直到我将它们添加到“保留”部分。我还没有使用 proguard 来减小我的依赖 jar 的大小 - 这可能吗?
    • @brian_d - 是的,应该可以,使用 -injars/-outjars。我想“难度”将与您拥有的罐子数量有关。我使用的一个示例是 bouncycastle 加密。我能够只包含我需要的类,丢弃所有未使用算法的代码,等等。
    【解决方案2】:

    首先,如果您只使用 JAR 文件中的一个类,这并不意味着该类不使用该 JAR 中的其他类。 如果您使用开源 JAR,您可以选择获取该 JAR 的源代码,将它们附加到您的项目中,删除不必要的内容并自行构建更改。

    【讨论】:

    • 仍然有问题,如我的“编辑#2”中所述。我手动将 swingx 从 1.4MB 减少到 160kB。它构建良好,但由于未包含几个反射方法类调用而在运行时崩溃。
    【解决方案3】:

    您可以将 GenJar 添加为 Ant 任务并使用它来构建 JAR。正如图书馆主页上所说,

    GenJar 是一个专门的 Ant 任务, 基于类构建jar文件 依赖而不是简单的 目录的内容。

    你可以在SourceForge找到它。

    【讨论】:

    • 我对 GenJar 感到沮丧,出现“无法解决”错误。看起来它自 2003-03-06 以来也没有更新过。
    • 当我使用 Java 7 而不是 Java 8 时,我发现 GenJar Unable to resolve issues 消失了
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多