如果javac是用Java编写的,为什么我可以执行javac就像它是一个非java程序一样?

Neo*_*Neo 7 java

需要将Java程序打包到JAR文件中,以便可以使用java -jar命令执行它.所以,为什么我不具备执行javacjava -jar javac命令?Sun/Oracle是如何将java程序转换为可执行的二进制文件的?

我知道有些工具可以将jar文件转换为Windows可执行文件.但我希望我的jar可以在没有bash脚本帮助的情况下在Linux/OS X中执行.

----------更新

我发现此链接非常有用:https://github.com/maynooth/CS210/wiki/Convert-Java-Executable-to-Linux-Executable

Raj*_*Raj 4

如果javac是用Java编写的,为什么我可以像非java程序一样执行javac?

Jon Skeet 已经针对“为什么 Java 编译器作为可执行文件而不是 JVM 字节码分布?”这个问题给出了答案。

下面引用他的回答

javac.exe(在我的安装中,Windows x64 上的 JDK 1.8)大小约为 15K。这不是完整的编译器。编译器本身实际上是用 Java 编写的,而 javac.exe 实际上只是一个启动器。Java 附带的许多工具都是如此 - 必须运行以下命令会很痛苦:

java -cp path/to/javac.jar java.tools.Javac -cp path/to/your/libraries Foo.java
Run Code Online (Sandbox Code Playgroud)

理解整个事情的一个简单方法是想象 JRE(Java 运行时环境)充当程序和操作系统之间的中间层。JRE接受字节码并运行您的java程序。javac(java编译器)将您的java源代码转换为平台中立的字节代码(有例外)。我不确定java、javac、jre是否是用java编写的。但如果它们是,那么它们必须在不同的操作系统(平台)中以不同的方式链接/加载。

现在来谈谈如何在Windows和Linux中运行jar

通常java代码会被转换成jar文件。然后会有两个文件(大部分是与jar文件一起)来启动jar文件,一个用于windows,一个用于linux

例如 Apache tomcat 有文件(位于同一位置)

startup.bat ==> to start program in windows.
startup.sh  ==> to start program in linux.
Run Code Online (Sandbox Code Playgroud)

或者,您可以将 jar 转换为 Windows 的 exe。对于 Linux,您指定的链接就足够了。该脚本由 Linux 中的命令解释器解释,并且您的 jar 文件将被执行。

此链接指定了在 Linux 中执行 shell 脚本的不同方法。 http://www.thegeekstuff.com/2010/07/execute-shell-script/

此链接包含将 jar 作为 bat Run .jar from batch-file运行的代码

总而言之,您的 jar 文件可以是平台无关的,但启动 jar 文件的方式对于不同的平台会有所不同。