制作一个单jar的java应用程序

如果我有一个由几种不同类型的文件(图片,声音等)和多个jar依赖项组成的java项目,那么将它们全部打包到一个可以双击的jar中的好方法是什么?

我知道jar子本身是相当愚蠢的,因为他们不会在自己内部寻找他们所依赖的文件(我只是在一丝沮丧之后才意识到这一点(轻描淡写))。 – 如果jar A依赖于jar B中包含的类,那么将jar B放入jar A中是行不通的。 Jar A必须与jar B在同一目录中。

…现在,我知道我可以从所有其他jar中提取所有文件并将所有文件放在同一目录中。 这样做有点工作,但我不想这样做,因为:1。它会很混乱2.它仍然无法解决需要将声音文件放在与最终jar相同的目录中的问题。 (无论出于何种原因,声音文件的行为与内部jar完全相同)

基本上,我只是想做到这一点,以便我的应用程序所依赖的文件不是令人讨厌的可见和炫耀。 所以,如果有一些解决方案,我可以将所有内容放在一个jar中并让它成为运行整个程序的唯一必要文件,那将是最佳的。 但是,我愿意接受创造性/创造性的方法来绕过这个问题,比如让父目录中的批处理脚本执行jar或其他东西。 (我说“或者什么”,因为那个确切的场景只适用于Windows操作系统….你知道我的意思!)

您可以提取所有JAR并将它们合并到一个公共JAR中。 有ANT任务和Maven插件可以随时使用。 此外,如果您的应用程序已正确编写,则无法阻止您将媒体文件和其他资源放入JAR中。 您只需要确保这些资源是“ 从类路径加载 ”,而不是从当前工作目录加载。

Apache Maven plus shade插件将完全满足您的需求。

查看“Shade插件,其中Main-Class被添加到MANIFEST.MF”部分http://maven.apache.org/plugins/maven-shade-plugin/examples.html

如果你使用maven的程序集插件,你可以让它下载依赖项,构建模块并生成一个可执行jar。

如果您正在构建一个可执行jar并且需要在类路径中提供其他jar,那么jar的MANIFEST.MF文件中有一个Class-Path:行,它列出了要包含在类路径中的条目(包括jar和目录)当主类运行时。

我通常使用我的IDE或ant来构建这样的可执行jar并设置Class-Path:头。

顺便说一句,要使jar可执行,请在MANIFEST.MF文件中设置Main-Class:行。

这是我构建的可执行jar的示例:

Main-Class: com.example.app.MyAppCLI Class-Path: log4j.jar driver.jar libraries.jar 

这是一个相应的ant目标来构建这个:

         

如果您将使用像ant这样的工具来构建可执行jar,它将使该过程更容易重复,并且还将为您处理奇怪的边缘情况,例如当MANIFEST.MF中的标题行变得太长时会发生什么。

如果您使用Maven,那么我建议使用阴影或组装插件。 如果没有,那么请阅读: 将发布合并到一个JAR文件的最简单方法

如果您使用Maven,您可能会欣赏onejar-maven-plugin 。 一个主要的好处是你的所有依赖jar都留在jar子里,你的代码在自己的jar子里。 所有这些jar都放在一个更大的jar子里,这个jar子是可执行的,从而避免了一些潜在的类路径问题。 阅读使用指南和此博客文章以获取更多信息。

有一个java项目,包含几种不同类型的文件(图片,声音等)和多个jar依赖项,有什么方法可以将它们全部打包到一个可以双击的jar中

部署富客户端应用程序的更好方法。 正在使用Java Web Start 。 最终用户永远不会看到Jar,并且可以提供桌面快捷方式或菜单项来启动应用程序。