java javac 以及 javaw

java javac 以及 javaw

1.javac

一个java程序运行的流程:
源码->编译(.java->.class)->运行(.class->启动jvm)
javac 的目的就是编译 将.java变成.class 将高级编程语言变成字节码 字节码不是机器码我记得是java提供的一种实现独立于底层硬件之外的方法, 因为大部分机器的机器码都是不一样的如果编译成机器码将会高度依赖于底层硬件, 所以这里编译成字节码实现硬件无关.
接下来我们看一下 javac 的编译流程
在这里插入图片描述
其中这里面的蓝色为javac的对应的类 红色的部分是对应的产出物
编译完成后最后是给JVM用的字节码对应了我们上面说的. 至于上面的词法分析器语法分析器对应了javac中的哪些类 可以去看一下 https://blog.csdn.net/u011983531/article/details/49430153
这里我们提两个类:
com.sun.tools.javac.parser—读取java源文件并创建语法分析树的类
com.sun.tools.javac.tree—表示java语言的被标注的语法树的类. 最顶层的节点Tree.TopLevel表示源文件的内容(应该是JCTree.TopLevel)
总结一下:

  1. java 的运行过程是 源码->编译(.java->.class)->运行(.class->启动jvm)
  2. javac 是java的编译器 将 .java编译成.class 将高级语言编译成java JVM能看懂的字节码
  3. javac 在 jdk/lib/tool.jar 中的 /com/sun/tools/javac
    在这里插入图片描述
    在这里插入图片描述
    到这里有没有想起来配置环境变量的时候要在CLASSPATH中加入jdk/lib/tool.jar 是因为很多工具类都在里面 但是真正使得javac全局化的还是Path中添加的
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

有没有很奇怪一个毫不相关的路径怎么能使javac全局可见呢 进入bin之后找到了答案 下面是bin的截图
在这里插入图片描述
这里找到了 javac的可运行程序只有16KB因此应该是javac的快捷方式在bin下所以引入bin就实现了全局可见
这也是为什么java javaw javadoc等一系列命令在path中更改后都会变得全局可见, 但是正如之前说过的java 和 javaw不需要path这两条就能全局可见原因见Windows 10 配置 java 环境变量

2. java 和 javaw

在安装jdk后 电脑中会出现三个javaw,一个在jdk文件下的bin中,一个在jdk同目录的jre中,一个在windows/system32中,当然这三个目录中还有三个java.exe和javaws.exe。
那我们的程序会使用哪一个javaw来运行我们的程序呢。如果程序的配置文件中可以指定的,就用指定的。
使用的就是我们在环境变量中配置的,path下的,顺序靠前的那一个bin下的程序。

不同点:

  1. javaw.exe运行程序时不会输出控制台信息,如果是双击打开jar文件的话(假设已经设置好了打开方式),那么根本就不会出现控制台窗口,主要用来运行带窗体的应用程序,其中的“w”就是window的意思,所以用它来运行控制台程序时虽不会报错,但不会输出任何结果。而java.exe无论运行控制台程序,还是运行窗体程序都没有任何问题。
  2. 运行java命令时,会出现并保持一个console窗口,程序中的信息可以通过System.out在console内输出,而运行javaw,开始时会出现console,当主程序调用之后,console就会消失。
原创文章 28 获赞 44 访问量 3800

猜你喜欢

转载自blog.csdn.net/qq_42141943/article/details/105970034