Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将所有jar依赖项打包到一个大jar中?_Java_Jar_Dependencies - Fatal编程技术网

Java 是否可以将所有jar依赖项打包到一个大jar中?

Java 是否可以将所有jar依赖项打包到一个大jar中?,java,jar,dependencies,Java,Jar,Dependencies,我知道这不是“最佳实践”,但我可以将所有依赖项都包含在一个大罐子中吗?通常可以,但有时有不寻常的法律或技术原因不这样做 法律:例如,我们发现,在我们想要的时候,我们无法将JavaMail jar文件与应用程序的其余部分捆绑到一个大的包中,但许可协议规定我们必须将它们分开 技术:另一个问题可能是自定义类装入器在特定jar文件中查找特定资源或类。这通常发生在应用服务器或ESB容器的上下文中 方法:要做到这一点,只需将所有内容取消归档到一个目录中,然后从那里重建一个jar。您可能需要调整META-

我知道这不是“最佳实践”,但我可以将所有依赖项都包含在一个大罐子中吗?

通常可以,但有时有不寻常的法律或技术原因不这样做

  • 法律:例如,我们发现,在我们想要的时候,我们无法将JavaMail jar文件与应用程序的其余部分捆绑到一个大的包中,但许可协议规定我们必须将它们分开

  • 技术:另一个问题可能是自定义类装入器在特定jar文件中查找特定资源或类。这通常发生在应用服务器或ESB容器的上下文中


方法:要做到这一点,只需将所有内容取消归档到一个目录中,然后从那里重建一个jar。您可能需要调整META-INF文件夹中的一些设置,以删除加载其他JAR的请求,并处理不同JAR都有一个默认类要运行的情况。有一些第三方实用程序可能会有所帮助,但除非您知道它们在做什么,否则您应该小心。

有一个名为的实用程序,它可以满足您的需要,尽管我建议不要这样做。性能通常很差。

如果您想这样做,有一个名为的工具可以为您这样做。从未使用过它,但很难忘记它的名字。

我使用了描述符。

  • 您可以取消归档文件并使用命令行重新打包它们

  • 您可以使用[uberjar]

  • 你可以用


使用好的老蚂蚁:只需将
zipgroupfileset
与蚂蚁一起使用即可



这将扁平化所有包含的jar库的内容。

Eclipse3.4及更高版本允许您这样做。右键单击项目,选择Extract,然后导航到Runnable Jar选项。选择下一步。选择适当的设置并关闭和运行。我似乎还记得,这个功能是使用FatJar(上面提到的)使用的相同或类似的库实现的。

为了完整起见,我们将为您完成这项工作,还可以选择模糊和缩小jar。后一个函数对于创建最终部署jar特别有用。

还请记住.jar文件是隐藏的.zip文件。您可以使用您喜爱的zip工具(重新)打包它们。在这种情况下,您必须自己处理清单文件。

我的感觉是,称一个Jar的性能糟糕是不公平的。对于中等大小的应用程序,启动时间可能会延长几秒钟(但这不会影响JVM启动屏幕)。对于大多数环境,数十兆字节的内存开销可以忽略不计,但嵌入式系统除外。另外,一个Jar能够自动将一些文件提取到文件系统中,这就省去了在我的例子中开发安装程序的需要

下面是量化一个Jar对我的应用程序的性能影响的尝试。它是一个基于Swing的GUI应用程序,由352个类组成,这些类与ProGuard 4.5b2混淆。一个JAR0.96用于将生成的类与价值12MB的库(ODFDOM、Saxon-HE、Xerces、Jaxen、VLDocking、Apache Commons等)捆绑在一起。我已经将模糊处理的jar的性能与一个jar处理的同一个jar进行了比较

  • 从JVM开始到main()方法的开始:0.5s没有一个Jar,1.7s有一个Jar。从JVM启动到屏幕上出现应用程序窗口:2.3s没有一个Jar,3.4s有一个Jar。因此,一个Jar会增加1.1秒的启动时间
  • 一个Jar不会增加JVM启动和屏幕上显示的启动映像之间的延迟(如果通过Jar清单实现的话),因此启动时间的增加对于交互式应用程序来说不是太烦人
  • 我们讨论的是类装入器,所以除非您广泛使用动态类装入,否则不会对代码执行速度产生影响
  • 查看JVM统计数据(通过jconsole)表明,One-Jar的红色版本占用更多堆内存。对于我的应用程序,开销大约为数十MB。我看到了16MB对40MB、306MB对346MB、131MB对138MB的数据,这取决于应用程序正在处理的用户数据以及很久以前执行的垃圾收集器
上述时间是通过在从Linux shell启动JVM之前,在main()方法的开头和我的应用程序窗口的windowOpened()事件处理程序中获取时间戳获得的。这些测量是在一台速度不太快的D820笔记本电脑上进行的,该笔记本电脑具有1GHz的双核CPU和运行Ubuntu 8.04的2G或RAM


希望有帮助。

一个JAR在启动时将所有依赖项JAR加载到内存中。这听起来可能效率极低,但自2004年发布以来,没有人向我抱怨过。预加载的可能效果是应用程序类加载的总体速度加快,因为类加载器不必在应用程序运行时重复扫描类路径中的资源和类:所有内容都是哈希映射的

构建一个可按需加载的惰性加载程序非常简单:但我是说“构建它、测量它、必要时改进它”的学校的一员,到目前为止还没有必要改进它


我会在以后的版本中记住这一点(或者如果其他人想解决这一问题,那也太好了,因为没有一个非常大的应用程序来衡量,很难知道更改是否是改进)。

让我们假设它是合法的,你怎么做?双关语+1减去一百万。Maven处理这类事情非常棒。但是,我建议创建一个自定义程序集,而不是使用带有依赖项的默认jar,因为这样可以获得更好的结果。另外,值得注意的是,最新的汇编插件有点缺陷&添加了依赖项的多个副本,所以在此之前
<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>