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

7
Java程序需要打包成JAR文件才能使用"java -jar"命令执行。那么为什么我不需要使用"java -jar javac"命令来执行"javac"呢?Sun/Oracle是如何将Java程序制作成可执行二进制文件的?
我知道有一些工具可以将JAR文件转换成Windows可执行文件。但我希望我的JAR文件在Linux/OS X上也能够直接执行,而不需要使用bash脚本。
---------- 更新
我发现这个链接非常有用:https://github.com/maynooth/CS210/wiki/Convert-Java-Executable-to-Linux-Executable

2
我相信它是用C语言编写的(主要是)。如果你愿意,你可以研究一下Jars的本地可执行文件。 - MadProgrammer
2
@MadProgrammer:不是这样的。javac.exe只是一个调用相应Java类的薄包装器。它启动虚拟机(类似于java.exe的方式),然后调用Java编译器。 - user330315
@a_horse_with_no_name 你有相关的参考资料吗? - MadProgrammer
1
javac 本身是用 Java 编写的。@MadProgrammer 参考链接 - https://en.wikipedia.org/wiki/Javac - Ankit Sharma
3
你可以轻松运行以下命令:java -cp tools.jar com.sun.tools.javac.Main,它会与javac.exe完全相同。此外,我认为你可以在java.exe的源代码中找到提示(请参阅源目录中的launcher/java.c)。 - user330315
显示剩余2条评论
1个回答

4
如果javac是用Java编写的,为什么我可以像执行非Java程序一样执行javac呢?
你问题的答案已经由Jon Skeet在为什么Java编译器作为可执行文件而不是JVM字节码分发?中给出。
以下是他的回答:
javac.exe(在我的安装中,JDK 1.8在Windows x64上)大小约为15K。这不是完整的编译器。编译器本身确实是用Java编写的,而javac.exe只是一个启动器。这对于许多随Java一起提供的工具来说都是正确的——必须运行类似于:
java -cp path/to/javac.jar java.tools.Javac -cp path/to/your/libraries Foo.java

一个简单的理解方式是将JRE(Java运行时环境)想象成程序和操作系统之间的中间层。JRE接受字节码并运行您的Java程序。javac(Java编译器)将您的Java源代码转换为平台中立的字节码(有例外情况)。我不确定Java、javac、JRE是否是用Java编写的。但如果是这样,它们必须以不同的方式在不同的操作系统(平台)上链接/加载。
现在来看如何在Windows和Linux中运行jar文件
通常,Java代码会被转换为jar文件。然后会有两个文件(大多数与jar文件一起),一个用于Windows,一个用于Linux,以启动jar文件。
例如,Apache Tomcat在同一位置具有文件。
startup.bat ==> to start program in windows.
startup.sh  ==> to start program in linux.

您可以将jar转换为exe以在Windows上运行。对于Linux,您指定的链接已足够。该脚本由Linux中的命令解释器解释,并将执行您的jar文件。
此链接指定了在Linux中执行shell脚本的不同方法。 http://www.thegeekstuff.com/2010/07/execute-shell-script/ 此链接具有作为bat运行jar的代码 Run .jar from batch-file 总之,您的jar文件可以是跨平台的,但是启动jar文件的方式将因不同的平台而异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接