【问题标题】:Why Java programs use .bat file as program launcher?为什么 Java 程序使用 .bat 文件作为程序启动器?
【发布时间】:2010-05-15 15:07:48
【问题描述】:

我发现 Windows 中的很多 Java 程序都使用 .bat 批处理文件作为程序启动器。与其他使用 .exe 可执行文件的程序相比,它看起来很奇怪。

为什么那些 Java 程序不能使用 .exe 文件?这是Java程序的限制吗?

谢谢。

【问题讨论】:

  • 没有什么能阻止您将 Java 程序编译为 .exe 文件。语言规范中没有任何内容表明您不允许将其编译为 .exe。

标签: java batch-file


【解决方案1】:

创建一个 .bat 文件并在其中包含 java -jar <archive-path> 并运行它非常简单。您可以轻松编辑 .bat 文件并对其进行更多配置。你只需要记事本。

它看起来也很像 Linux 的 bash 脚本文件。这使得用于执行 .jar 中的程序的 .bat 文件可以轻松地从 Win 传输到 Linux。

虽然 .exe 文件不容易修改(如果有的话)并且会产生一些元数据,但生成的 .exe 更大...EXE 也是 Windows 特定的文件扩展名...

当然,如果您想将所有内容打包在一个文件中,并且让用户不必担心删除 .jar 文件但仍然有 bat……那是另一种情况。

【讨论】:

    【解决方案2】:

    批处理文件经常执行“java -jar”并额外添加 JVM 参数 - 这不能添加到 jar 文件中。

    编写 bat 文件比将 java 存档打包到 exe 文件更快 - 这些工具通常是商业的或不能很好地工作...

    此外,在 java 中完成的本机 Windows 可执行文件 (.exe) 并不多(但是,它仍然是可能的 - vuze、limewire 等)

    【讨论】:

    • 对于“本机”Java 程序,您所指的 PE 可执行文件只不过是启动 JVM(通常在 DLL 中)并启动一个 jar 文件——与批处理文件所做的一样,只是更隐蔽一点。您可以更进一步,将 jar 嵌入到可执行文件中,但我怀疑这种做法经常发生。
    • 是的——但问题不在于如何分发 java 程序,而在于批处理文件的作用......
    【解决方案3】:

    Java 无法编译为 .exe。它编译成一个虚拟机,JVM。这是 Java 平台技术的基本方面。

    .bat 本质上是一个用于 Windows 的 shell 脚本。它确实执行.exe,例如java.exe 来自 JRE,然后运行字节码编译的 Java 代码。

    【讨论】:

    • .NET CIL 也不是本机代码,而是驻留在普通的 PE 文件中。并不是 Java 做不到,只是设计者没有这样做。
    【解决方案4】:

    实际上,很多 Java 应用程序确实使用本机启动器而不是批处理脚本:EclipseNetBeansIntelliJ IDEAJRubyVuze 只是其中的少数例子。

    人们更频繁地这样做的主要原因是,在 C 中嵌入 JVM 实际上有些棘手,如果您可以通过批处理脚本启动它,那么为什么麻烦吗?

    【讨论】:

      【解决方案5】:

      好问题。我还想知道为什么 Sun 从来没有提供一些工具来生成 .exe。

      exe 文件比 bat 文件更易于使用。它有一个漂亮的图标等。

      我曾经自己写过东西:http://www.bitstorm.org/jarx/

      【讨论】:

      • 不,就用户友好性而言,用户甚至根本看不到文件是什么类型,他只是点击快捷方式。
      • Java 可以用 JAR 构建,在 JVM 上和 EXE 在 WIN 上是一样的。
      【解决方案6】:

      批处理文件可以使用必要的类路径等加载 JVM,并告诉它运行 jar 或类或 jar 中的类。生成一个可执行的 PE 映像只是为了发出一两个命令来启动 JVM 并告诉它打开一个 jar,这太过分了,而且工作量更大。

      【讨论】:

        【解决方案7】:

        嗯...例如,如果要执行 .class 文件,则必须使用批处理文件。您想使用批处理,因为您必须将您的 java 程序 URI 传递给 java 虚拟机(也是一个程序),以便它可以执行它。

        但是你可以把java程序构建成可执行的,和EXE一样(只需要双击执行)。它的扩展名是 .JAR,有时您需要将 .JAR 扩展名关联到 Java Platform Binary(或类似的)来实现这一点。然后由 Windows 将您的 java 应用程序的 URI 传递给 java 虚拟机,以便它被执行。

        要在 NetBeans 中执行此操作,请执行 Build 命令,然后在您的项目文件夹中找到文件夹 dist,您将在那里看到一个 java 可执行文件。

        exe,或者没有exe,从用户的角度来看,功能是一样的,所以它不会计量...

        注意事项

        Java 程序是独立于平台的,因此在不同平台上的执行过程可能不同。如果 Java 仅适用于 Windows,我相信 SUN 会使其编译为 Windows EXE。

        【讨论】:

          【解决方案8】:

          欢迎来到 DOS shell 脚本的世界。您可以使 jar 文件可执行,但如果您只有 java 类文件,那么您能做的最好的事情就是键入一个小脚本来运行您的 java 程序。

          【讨论】:

            【解决方案9】:

            Java 程序从一开始就被设计为不是由操作系统运行,而是由虚拟机运行。当您“运行 java 程序”时,您实际上是在启动虚拟机并告诉它加载您的程序。

            这就是它的设计方式。并不是说他们在质量部门偷懒了(一个回答表明 Sun 的产品只完成了 80%),这是一个有意识的决定。而且因为创建批处理文件、快捷方式、shell 脚本或可执行文件来提供一键式启动器非常简单,因此没有必要添加将 java 程序转换为单击 .exe 的功能(在窗户的情况下)。

            【讨论】:

              【解决方案10】:

              我的两个原因是:

              1. 许多安装程序构建器不允许创建包含例如java -jar whatever.jar 的程序菜单快捷方式,除非您以某种方式将安装程序配置为接受java 作为目标计算机上存在的程序。这可能很困难或不可能,但创建一个包含在发行版中的 BAT 文件的快捷方式是轻而易举的事。
              2. 如其他人所说:需要根据宿主机配置添加JVM启动参数。

              【讨论】:

                【解决方案11】:

                您可以,多平台安装制作工具可以为您创建一个。例如,InstallAnywhere,它会为你的 java 应用程序创建一个 windows 可执行文件。

                Sun 是一家遵循 80/20 法则的公司,他们把最重要的事情做好了,但从来没有把它做好。例如,比较浏览器检测和安装到adobe flash的java插件。许多年前,Flash 快速简单,而 java 插件经常将您转发到 sun 站点,仅此而已。

                回到可执行文件,java模型是一次编写,多次运行,当Sun决定提供一个启动器时,他们必须为所有平台提供它。例如,windows JDK 需要为 windows x86、ia64、amd64 提供启动器,linux/unix 可以共享启动器,因为它们都使用共享 shell 脚本。那么问题来了,sun 是否显示了 mac 的打包程序?它只是不适合,您绝对应该研究一下 installanywhere 和 install4j 之类的工具,它们都包含 java 启动器。

                【讨论】:

                • 分发桌面应用程序的标准方法是使用 Java Web Start。而关于 Sun 没有让事情顺利进行的说法是非常有争议的。 Java 很适合我。
                • Sun 绝对不是一家遵循 80/20 规则的公司。您似乎不太了解 Sun 的历史。
                【解决方案12】:

                您可以使用 autoit 快速创建一个带有自定义图标的 exe,该图标看起来比 .bat 文件更专业。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多