javac.exe 、 java.exe、 javaw.exe 、 javaws.exe有什么区别?

   最近用命令行执行jar包时,碰巧遇到了这个问题,有点感兴趣,查了大量资料之后,简单地写写我自己的总结,以供大家参考。
   首先,我先贴上我主要参考的文章 一个是javapapers.com,另一个是java和 javaw 以及 javaws的区别,第二篇文章是对第一篇的翻译。还有一个是Oracle的官方文档 Contents of JDK
   再说一些东西,虽然java用了一段时间,但是我到昨天才基本明白jdk 和 jre (里面如果谈深了,就说到jvm了。我现在不懂,就不献丑了) 。jre 全称 java runtime environment ,翻译成中文就是java 运行环境,就是说一个你写的java文件要想跑起来,必须得有个jre。那么jdk是什么,jdk全称 java development kit翻译成中文就是java 开发工具箱,你想开发java语言程序就得用jdk。注意,jdk里面包含了jre,而我们今天谈的上面四个.exe文件就在jdk文件里面。

   如下图所示:

javac.exe

   javac 叫做java编译器,我们直接写的.java文件必须编译成.class文件才能运行,而javac的工作就是将我们写的.java 文件翻译成.class文件。

java.exe 和 javaw.exe

初步辨别

  这里我先引用 Oracle官方文档的话。

  The java command starts a Java application. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class’s main() method.

  也就是说,java.exe的工作就是通过启动jre,加载特定的class文件,并调用class的主方法的方式来启动一个java应用。说白了。java.exe就是让编译后的class文件跑起来。
  那么,javaw.exe又是什么?Oracle官方文档是这么说的,

  The javaw command is identical to java, except that with javaw there is no associated console window. Use javaw when you do not want a command prompt window to appear. The javaw launcher will, however, display a dialog box with error information if a launch fails.

  也就是说,javaw.exe基本上就是java.exe ,但是javaw没有一个相关联的控制台,如果你不想用控制台的话,那就可以用javaw。如果javaw启动程序失败的话,就会出一个dialog窗口展示错误信息。
   是不是不懂?那我来解释一下 。
   首先,我们平时的System.out.println(),打印的东西都到了控制台里面,也就是说,控制台是电脑和人交互的一种方式如果我们写的程序需要控制台,那么我们可以采取java.exe来启动应用程序。
  换言之,如果我们不需要使用控制台的时候我们可以用javaw 来启动应用程序。那什么时候,我们不需要用到控制台呢?这种情况多了去了,GUI(图形用户界面)就是常用的交互方式。
   所以到这里,我们基本明白了java.exe 和javaw.exe的区别,但是在实际操作中又有那些不同呢?

实际操作

   为了操作,我写了一个简单的GUI程序,效果如下所示

  通过点击图中的点我按钮,其效果是:可以将修改按钮的内容为“Hello World”,并在控制台中输出HelloWorld代码在文末。
  我现在的想法就是用命令行分别用 java 和 javaw来启动程序,通过观察cmd 和 任务管理器查看到底会有什么效果。为了简单我提前将我的项目打包成jar,放在桌面上。

用java来启动我的jar包

  通过java 启动程序之后,我点击按钮,可以发现控制台的确输出了HelloWorld。请留意箭头所示,接下来将与javaw区分

  那么查看任务管理器,会发现的确出现了java.exe。

用javaw来启动我的jar包

  在下面的gif中,请留意我点下命令的那一刹那,cmd标题的不同。
在这里插入图片描述
  你会发现在我点下命令的一刹那。cmd的标题突然闪了一下,之后,我再点击按钮,发现控制台并不能打印出:Hello World。也就是说,此时的控制台没有与我的应用程序关联起来。
  继续查看任务管理器,会发现的确出现了javaw.exe.

  那么为什么标题会闪一下?查看javapapers,你会发现它会有这么一句话

  We can execute the above GUI application using both java.exe and javaw.exe If we launch using java.exe, the command-line waits for the application response till it closes. When launched using javaw, the application launches and the command line exits immediately and ready for next command.

  java.exe 和 javaw.exe都可以启动GUI程序。java启动GUI程序时,cmd会等待程序的响应,直到程序终止。也就是说,cmd此时是和程序关联起来的。而javaw启动GUI程序.cmd只存在瞬间,然后就等待下一个命令。也就是说,cmd只存在短暂的时间和程序关联起来,这也是为什么标题闪现的原因之后,cmd就没有和程序关联,所以我们点击按钮,不能打印Hello World到控制台里面。
  我个人猜测,javaw.exe内部肯定是调用了某个函数使得cmd 和程序脱离联系,就好像是简单的if else 语句一样,

......
if(applicationLauncher=="javaw.exe"{
    cmd  和 application脱离联系
}else  if(applicationLauncher=="java.exe"{
    cmd  等待 application响应
}
......

javaws.exe

  javaws.exe 是用来启动web分发的java的程序。我自己不熟悉,所以我不多说,想了解更多,可以点击我之前发的参考文章链接。

总结

  1. javac.exe 是编译程序 ,它将.java文件编译成 .class 文件。
  2. java.exe 是java的启动程序,它有一个与它相关的控制台。
  3. javaw.exe 也是java的启动程序,它与java.exe 没有多大差别,只是它没有一个相关的控制台用于交互而已。
  4. javaws.exe 是用来启动web分发的java的程序。

附录

package com.test;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

/**
 * @Author Lord_Bao
 * @Date 2020/3/2 20:23
 * @Version 1.0
 */
public class HelloWorld extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        //primaryStage 初始化
        primaryStage.setWidth(600);
        primaryStage.setHeight(400);
        primaryStage.setTitle("Hello World");
        primaryStage.getIcons().add(new Image("com/image/ooopic_1572334333.png"));


        //添加组件
        AnchorPane ap=new AnchorPane();
        Button btn=new Button("点我");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                btn.setText("Hello World!!!");
                System.out.println("Hello World!");
            }
        });
        ap.getChildren().add(btn);

        AnchorPane.setTopAnchor(btn,170.0);
        AnchorPane.setLeftAnchor(btn,260.0);

        Scene scene =new Scene(ap);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
  • 28
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java.exejavac.exeJava开发工具中的两个不同的程序。 java.exeJava虚拟机(JVM)的执行程序,它负责解释和执行Java程序的字节码。当我们在命令行中输入"java xxx"时,就是在调用java.exe来执行xxx.class文件。 而javac.exeJava编译器的执行程序,它负责将Java源代码编译成字节码文件(.class文件)。当我们在命令行中输入"javac xxx.java"时,就是在调用javac.exe来将xxx.java文件编译成xxx.class文件。 因此,java.exejavac.exe的主要区别在于它们的功能不同,一个是执行Java程序,一个是编译Java程序。 ### 回答2: Java是跨平台的高级编程语言,它可以让开发人员创建各种类型的应用程序,从简单的命令行工具到复杂的企业级Web应用程序。 Java的代码是由Java编译器编译成Java字节码,这些字节码由Java虚拟机(JVM)解释执行。Java编译器由两个主要组件组成,即java.exejavac.exeJava.exe Java.exeJava虚拟机(JVM)的一部分。它是运行Java字节码的主要组件。当Java程序被编译并生成字节码文件后,它们必须由java.exe在JVM上运行。 Java.exe可以通过命令行启动,也可以在Web浏览器中作为Java插件运行。在命令行中,可以使用以下命令启动Java虚拟机: java [options] classname [args] 其中,[options]是可选项,用于指定Java虚拟机的运行参数。classname是要运行的Java类的名称。[args]是传递给Java类的参数列表。 Javac.exe Javac.exeJava编译器的一部分。它用于将Java源代码编译成Java字节码。Javac.exe从.java源代码文件中读取代码,然后将其编译成Java字节码。这些字节码可以由java.exe在JVM上执行。 在命令行中,可以使用以下命令来编译Java源代码: javac [options] filename.java 其中,[options]是可选项,用于指定编译器的选项和参数。filename.java是要编译的Java源代码文件的名称。 总结: Java.exeJavac.exe都是Java的重要组件。Java.exeJava虚拟机的一部分,它负责在JVM上运行Java字节码。而Javac.exeJava编译器的一部分,用于将Java源代码编译成Java字节码。Java程序必须首先使用Javac.exeJava源代码编译成字节码,然后再使用Java.exe在JVM上运行它们。 ### 回答3: java.exejavac.exeJava语言中两个非常重要的执行程序,它们的主要区别体现在针对不同的Java源文件进行编译和执行。 首先,java.exeJava的运行程序,可以说是Java虚拟机(JVM)的启动器。当开发者编写一个复杂的Java程序之后,需要把这个程序编译成一个字节码文件,格式为“.class”文件。然后,通过利用java.exe启动JVM,让字节码文件能够被JVM识别并完成程序的执行。也就是说,java.exe主要负责加载和执行已编译的Java程序。 而javac.exe则是Java开发者使用的编译器,它可以将源代码编译成为字节码文件,生成后缀为“.class”的可执行文件。也就是说,开发者编写的Java源代码,在使用了javac编译器之后,可以被转化为可在Java虚拟机上执行的格式化指令。因此,javac主要负责编译Java程序源代码,生成可以被java.exe启动的字节码文件。 另外,需要说明的是,java.exejavac.exe属于Java Development Kit(JDK)中的组件,是Java开发的必要组成部分。从本质上来说,它们是Java开发中不可或缺的两个程序执行器,能够实现程序的编译和运行。 总而言之,java.exejavac.exe虽然在名字上非常相似,但是它们的功能和作用却存在很大的区别java.exeJava运行时的启动程序,用于加载和执行已编译的Java程序;而javac.exeJava开发者主要使用的编译器,用于将Java源代码编译成可以在Java虚拟机上执行的字节码文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值