如果我有一个由多种不同类型的文件(图片、声音等)和多个 jar 依赖项组成的 java 项目,有什么好方法将其全部打包到一个只需双击的 jar 中?
我知道 jar 本身非常愚蠢,因为它们不会在自身内部查找它们所依赖的文件(我只是在经历了一点点挫折(轻描淡写)后才意识到这一点)。 -- 如果 jar A 依赖于 jar B 中包含的类,则将 jar B 放入 jar A 中将不起作用。 Jar A 必须与 jar B 位于同一目录中。
...现在,我知道我可以从所有其他 jar 中提取所有文件并将所有内容放在同一目录中。那会有点工作,但我不想这样做,因为:1.这会很混乱,2.它仍然无法解决需要将声音文件与最终声音文件放在同一目录中的问题罐。 (无论出于何种原因,声音文件的行为方式与内部 jar 完全相同)
基本上,我只是想让我的应用程序所依赖的文件不会令人讨厌地可见和招摇。因此,如果有某种解决方案,我可以将所有内容放入 jar 中,并使其成为运行整个程序的唯一必要文件,那将是最佳的。但是,我愿意接受创造性/创造性的方法来绕过这个问题,例如让父目录中的批处理脚本执行 jar 或其他东西。 (我说“或者其他什么”是因为这种情况只适用于 Windows 操作系统。...你知道我的意思!)
Apache Maven 加上 shade 插件 将完全满足您的需求。
查看可执行 JAR 示例。
您可以提取所有 JAR 并将它们合并到一个通用 JAR 中。有 ANT 任务和 Maven 插件可随时用于执行此操作。此外,如果您的应用程序编写正确,则没有什么可以阻止您将媒体文件和其他资源放入 JAR 中。您只需要确保这些资源是“从类路径加载”,而不是从当前工作目录加载。
如果您使用maven的程序集插件,您可以让它下载依赖项、构建模块并生成可执行jar。
如果您使用 Maven,那么我建议使用 shade 或程序集插件。 如果没有,请阅读以下内容:将版本合并到一个 JAR 文件的最简单方法
如果您正在构建可执行 jar 并且需要在类路径中提供其他 jar,则 jar 的 MANIFEST.MF 文件中有一个 Class-Path: 行,该行列出了要包含在主类运行时的类路径。
我通常使用 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 目标来构建它:
<target name="exejar">
<jar destfile="myapp.jar"
basedir="bin"
include="**/app/*.class">
<manifest>
<attribute name="Main-Class" value="com.example.app.MyAppCLI"/>
<attribute name="Class-Path" value="log4j.jar driver.jar libraries.jar"/>
</manifest>
</jar>
</target>
如果您将使用像 ant 这样的工具来构建可执行 jar,它将使该过程更容易重复,并且还将为您处理奇怪的边缘情况,例如当 MANIFEST.MF 中的标题行太长时会发生什么。
如果您使用 Maven,您可能会喜欢onejar-maven-plugin。一个主要好处是所有依赖项 jar 都保留在 jar 中,并且您的代码位于其自己的 jar 中。所有这些 jar 都放在一个更大的 jar 中,该 jar 是可执行的,从而避免了一些潜在的类路径问题。请阅读使用指南和这篇博客文章了解更多信息。
有一个由多种不同类型的文件(图片、声音等)和多个 jar 依赖项组成的 java 项目,有什么好方法将其全部打包到一个只需双击的 jar 中
部署富客户端应用程序的更好方法。正在使用 Java Web Start。最终用户永远不会看到 Jar,并且可以提供桌面快捷方式或菜单项来启动应用程序。