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

时间:2011-11-28 19:10:12

标签: java jar executable

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

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

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

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

7 个答案:

答案 0 :(得分:4)

Apache Mavenshade plugin将完全满足您的需求。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您使用Maven,那么我建议使用shade或汇编插件。 如果没有,请阅读:Easiest way to merge a release into one JAR file

答案 4 :(得分:1)

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

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

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

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

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

这里有一个相应的蚂蚁目标:

<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中的标题行也会出现时长。

答案 5 :(得分:0)

如果您使用Maven,您可能会感谢onejar-maven-plugin。一个主要的好处是你的所有依赖罐都留在罐子里,你的代码在自己的罐子里。所有这些罐都放在一个更大的罐子里,这个罐子是可执行的,从而避免了一些潜在的类路径问题。请阅读usage guide和此blog post以获取更多信息。

答案 6 :(得分:0)

  

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

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