如何为java程序创建Unix加载卡

时间:2013-06-05 15:19:39

标签: java linux unix

在Unix(或Linux)中,如果我想运行shell脚本,我可以使用#!/bin/sh启动该文件。使用awk,我使用#!/usr/bin/awk -f启动可执行文件,并将文件的其余部分视为程序。

如何使用Java程序执行此操作?我尝试将simple.class复制到simple,将#!/export/appl/Mail/java/bin/java置于顶部并使文件可执行,但我得到了:

69> ./simple
Error: Could not find or load main class ..simple

我知道这可以通过可执行的shell脚本或执行java解释器的C程序来完成。 Unix上的每个其他解释器都可以用#!加载卡调用,肯定有办法用Java做。

7 个答案:

答案 0 :(得分:1)

最常用的方法是拥有Java的包装器。执行“java -jar yourJar.jar”或等效的shell脚本。然后将 shell 脚本和Windows等效 bat 文件捆绑在您的产品中。

另一个选择是拥有一个本机启动器。例如,您可以看到Eclipse项目已经采用了这种方式。您下载Eclipse并且您有一个本机可执行文件可以运行。本机可执行文件将启动您的Java程序。

还有一个选择是将Java编译为本机代码。例如,您可以使用名为Excelsior JET(http://www.excelsior-usa.com/jet.html)的商业工具。

答案 1 :(得分:1)

Java类文件格式不允许在标题之前使用文本,这就是为什么Java运行时在修改后不再接受.class文件的原因。

在Linux上,您可以使用binfmt_misc来支持其他可执行格式,包括.class个文件。它基本上是一种告诉Linux内核如何检测可执行格式以及如何执行它们的方法。

Archilinux Wiki article更详细地解释了如何获得此效果。

答案 2 :(得分:0)

您无法使用Java程序执行此操作。首先,需要在执行之前编译Java程序。其次,即使不需要编译,哈希标志也不是Java中的注释,因此这将是语法错误。

答案 3 :(得分:0)

我从来没有听说过“加载卡”这个词#34;你所拥有的是一个"翻译指令"由shebang指定。这只是指定shell应该在给定脚本上调用哪个解释器。

至于为什么C程序可以直接在shell中运行,操作系统识别的可执行文件将传递给loader。 Java类不是可执行文件,至少对于OS来说也是如此。所以shell必须知道将控制传递给哪个解释器。

但正如你所注意到的那样,shebang并不起作用。原因是类文件采用JVM期望的特定二进制格式。编辑此文件将破坏约定并导致错误。因此,没有办法做你所问的。

但是,您可以创建一个"快捷方式"通过创建别名或者编写单行Shell脚本来包装您需要的java命令来运行您想要运行的程序。这是我理解的常见做法。

答案 4 :(得分:0)

其他答案解释了为什么你不能做你想做的事情。但是,如果shell是zsh,则可以创建后缀别名。例如,使用java:

执行.jar文件
alias -s .jar="/usr/bin/java -jar"

然后,要执行blarg.jar,只需输入./blarg.jar即可。当然,你必须首先chmod + x你的.jar文件。

答案 5 :(得分:0)

除了其他人建议的包装脚本和binfmt_misc解决方案之外,我想建议一个潜在的解决方案,它不能直接回答你的问题,但也许它可以解决你的实际问题。

由于Scala确实有一个可以运行代码而无需先编译代码的解释器,并且此代码可以引用任何Java代码,如果您的目标可以概括为“使用Java作为shell脚本语言” “,您可以使用.scala文件作为入门脚本(可以包含与scala一起运行的shebang),您可以从中调用所有Java类。这不是一个简单的基于bash的启动脚本,但它是一个很好的起点,逐步转向Scala脚本而不是Java,在这种情况下你可以摆脱编译到{{首先是1}}文件。

答案 6 :(得分:-1)

这不起作用的原因是Java不是真正的解释语言,它是部分编译的,部分解释的。

你需要将hashbang指令放入的.java源代码在java解释器运行之前需要编译为.class文件。编译器会删除注释,因此无法将.java中的注释推送到.class文件中。 .class文件是以特定格式“编译”的输出,因此在其顶部添加hashbang指令会破坏格式。

Java实际上不是一种脚本语言 - 但是有些JVM语言是。例如Groovy supports hashbangso does Clojure