我知道这不是“最佳实践”,但是我可以将所有依赖项包含在一个大罐子里吗?
答案 0 :(得分:16)
我的感觉是,称One-Jar的表现糟糕而且糟糕是不公正的。对于中等大小的应用程序,可以预期启动将花费几秒钟(尽管不会影响JVM启动画面)。对于大多数环境,除了嵌入式系统之外,几十兆字节的内存开销可以忽略不计。此外,One-Jar能够自动将一些文件提取到文件系统,这样就无需在我的情况下开发安装程序。
下面是尝试量化One-Jar对我的应用程序引入的性能影响。它是基于Swing的GUI应用程序,由使用ProGuard 4.5b2混淆的352个类组成。 One-Jar 0.96用于捆绑产生的类,其中包含12MB的库(ODFDOM,Saxon HE,Xerces,Jaxen,VLDocking,Apache Commons等)。我已经将混淆的jar的性能与One-Jar处理的同一个jar进行了比较。
上面的时间是通过在从Linux shell启动JVM之前,在main()方法的开头和我的应用程序窗口的windowOpened()事件处理程序中获取时间戳获得的。测量是在速度不是特别快的D820笔记本电脑上进行的,双核1GHz CPU和运行Ubuntu 8.04的2G或RAM。
希望它有所帮助。
答案 1 :(得分:13)
答案 2 :(得分:9)
使用优秀的旧Ant:只需将zipgroupfileset
与Ant Zip task
<zip destfile="out.jar">
<zipgroupfileset dir="lib" includes="*.jar"/>
</zip>
这将使所有包含的jar库内容变得扁平化。
答案 3 :(得分:6)
One-JAR在启动时将所有依赖项jar加载到内存中。这可能听起来非常低效,但自2004年发布以来,没有人向我抱怨它。预加载的可能影响是应用程序的类加载的整体加速,因为类加载器不必重复扫描类路径对于应用程序运行的资源和类:所有内容都是哈希映射的。
构建一个可以按需加载的延迟加载器非常简单:但是我所在的学校说“构建它,测量它,改进它 - 如果有必要的话”,到目前为止还没有必要改善它。
我将在未来版本中考虑到这一点(或者如果其他人想要解决它,那也会很棒,因为没有非常大的应用程序来衡量,很难知道更改是否有改进)。
答案 4 :(得分:5)
如果你想这样做,有一个名为Jar Jar Links的工具会为你做这件事。从未使用它,但很难忘记这个名字。
答案 5 :(得分:2)
通常你可以,但有时会出现不寻常的法律或技术理由。
法律:例如,我们发现在我们想要的时候,我们无法将JavaMail jar文件与我们应用程序的其余部分捆绑在一个大包中,但是许可协议说我们必须将它们分开。
技术:另一个问题可能是自定义类加载器在特定jar文件中查找特定资源或类。这通常发生在应用程序服务器或ESB的容器上下文中。
如何:要做到这一点,只需将所有内容解开到一个目录中,然后从那里重建一个jar。您可能必须调整META-INF文件夹中的某些设置以删除加载其他jar的请求,并处理不同的jar每个都有默认类运行的情况。有些第三方实用程序可能有所帮助,但除非您知道他们正在做什么,否则您需要小心。
答案 6 :(得分:2)
有一个名为One-Jar的实用程序可以满足您的需求,但我建议不要这样做。表现通常很糟糕。
答案 7 :(得分:2)
您可以使用命令行解压缩文件并重新打包
您可以使用[uberjar]
您可以使用fatjar
答案 8 :(得分:2)
Eclipse 3.4及更高版本允许您执行此操作。右键单击您的项目,选择Extract,然后导航到Runnable Jar选项。选择Next。选择适当的设置,然后关闭并运行。此外,我似乎记得使用FatJar(上面提到的)使用的相同或类似的库来实现此功能。
答案 9 :(得分:2)
为了完整起见,ProGuard将为您执行此操作,以及可选地混淆和缩小JAR。后一个函数对于创建最终部署JAR特别有用。
答案 10 :(得分:0)
还要记住.jar文件是.zip文件。您可以使用自己喜欢的拉链工具(重新)打包它们。在这种情况下,您必须自己处理清单文件。