java tool之javac、java命令

java tool简介:

Oracle公司java SE标准版产品的组件为下面官网提供图片中所示。jdk中有Tools(工具箱),工具箱中有我们熟悉的java命令-用于启动一个Java应用程序,有javac命令-用于读取Java类和接口定义,并将它们编译为字节码和类文件,也有javac命令-用于从Java源文件生成API文档的HTML页面,等等一些命令帮助开发。
java tool之javac、java命令_第1张图片
JDK Tool Specifications(jdk工具规范)官网:
https://docs.oracle.com/en/java/javase/16/docs/specs/man/index.html

扩展:jdk、jre、jvm、操作系统之间包含关系图示:
参考:https://jingyan.baidu.com/art...
java tool之javac、java命令_第2张图片

javac和java命令的作用:

官网中有简介:

  • javac-读取Java类和接口定义,并将它们编译为字节码和类文件。
  • java-启动一个java应用程序。

因为java语言具有跨平台性,我们使用java开发语言编写的文件为“.java”文件,通过java编译器将“.java”文件编译成java虚拟机(jvm)能够识别的“.class”文件。jvm在调用类库(lib)解释“.class”文件,并交给具体的操作系统进行执行。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在jvm上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

概念上可以把javac、java命令通过下面图片进行逻辑上的关联:

java tool之javac、java命令_第3张图片

javac命令

javac命令官网描述片段:

The javac command reads source files that contain module, package and type declarations written in the Java programming language, and compiles them into class files that run on the Java Virtual Machine.
翻译:javac命令读取包含用Java编程语言编写的模块、包和类型声明的源文件,并将它们编译为在Java虚拟机上运行的类文件。
The javac command can also process annotations in Java source files and classes.Source files must have a file name extension of .java. Class files have a file name extension of .class. Both source and class files normally have file names that identify the contents. For example, a class called Shape would be declared in a source file called Shape.java, and compiled into a class file called Shape.class.
翻译:javac命令还可以处理Java源文件和类中的注释。源文件必须以.java作为扩展名。类文件的文件扩展名为. class。源文件和类文件通常都有标识内容的文件名。例如,一个名为Shape的类将在一个名为Shape.java的源文件中声明,并编译成一个称为Shape.class的类文件。
javac expects that source files are arranged in one or more directory hierarchies on the file system, described in Arrangement of Source Code.
翻译:javac希望源文件被安排在文件系统上的一个或多个目录层次结构中,如《源代码安排》中所述。
By default, javac compiles each source file to a class file in the same directory as the source file. However, it is recommended to specify a separate destination directory with the -d option.
翻译:默认情况下,javac将每个源文件编译成与源文件相同目录下的类文件。但是,建议使用-d选项指定一个单独的目标目录。

javac命令具体使用

提示:在dos命令行窗口输入java可以看到java命令使用方法提示

javac命令主要是编译java源文件,也就是".java"到".class"文件的转换。其中经常使用的两个选项是"-d"和"-encoding"。
“-d”option:在实际项目中所有的类都是有包结构,也就是说一个完整的类名是包命+类名,"-d"选项可以使存在包结构的“.java”文件在当前路径下生成该类的包层次文件夹。这必须要求编译时使用-d选项。否则需要自己来建立包层次文件夹。
“-encoding”option:在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe会获得我们操作系统默认采用的编码格式。JDK根据操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),若源文件中存在中文,可能会出现不兼容的情况。

小例子:
在C:\software目录下创建一个test类

package cn.com.w;
class test{
    public static void main(String[] args){
        System.out.print("hello word");
    }
}

使用javac test.java命令后可以看到在当前目录生成了test.class文件。
java tool之javac、java命令_第4张图片
使用javac -d . *.java命令后可以看到在当前目录生成了包的层次文件夹。
命令解释:命令中的“.”指的是当前目录。“*.java”指的是所有“.java”文件。
java tool之javac、java命令_第5张图片

javac命令官网地址:
https://docs.oracle.com/en/java/javase/16/docs/specs/man/java.html

java命令

java命令官网描述片段:

The command starts a Java application. It does this by starting the Java Virtual Machine (JVM), loading the specified class, and calling that class's method. The method must be declared and , it must not return any value, and it must accept a array as a parameter. The method declaration has the following form:javamain()publicstaticString
翻译:该命令启动一个Java应用程序。它通过启动Java虚拟机(JVM),加载指定的类并调用该类的方法来完成此操作。这个方法必须声明,并且不能返回任何值,并且它必须接受一个数组作为参数。方法声明的形式如下 public static void main(String[] args)

By default, the first argument that isn't an option of the command is the fully qualified name of the class to be called. If is specified, then its argument is the name of the JAR file containing class and resource files for the application. The startup class must be indicated by the manifest header in its manifest file.java-jarMain-Class Arguments after the class file name or the JAR file name are passed to the method.main()
翻译:默认情况下,不是命令选项(-option)的第一个参数是 要调用的类 的完全限定名称。如果指定,则其参数为JAR文件的名称,该jar文件包含应用程序的类和资源文件。在将类文件名或JAR文件名传递给method.main()之后,必须通过其清单文件中的清单标头指示启动类。java-jarMain-Class参数。

java命令具体使用

提示:在dos命令行窗口输入java可以看到java命令使用方法提示

java [-options] class(执行类) [args...]

或 java [-options] -jar(执行jar文件) jarfile [args...]

使用java命令解释执行class文件时需要注意,要使用类的完全限定名,也就是包名+类名。若是一个类存在包接口,即有package xxx.xxx.xxx。此时需要知道java中包结构在操作系统中就是层级目录结构。所以在执行有包结构的class文件时,要在当前目录下执行java 包名.类名,这个当前目录也就是package的第一层目录,比如test.class文件的package为package cn.com.w,文件存储路径是C:\software\cn\com\w,这个当前目录就是cn目录所在目录,即C:\software。解释执行test.class文件流程就是dos命令窗口进入C:\software目录下,执行java cn.com.w.test命令。

反例:
首先无论什么操作系统在寻找一个文件时,都要通过路径(绝对路径和相对路径),在java开发中,有classpath(类路径的概念),jvm在解释运行class文件之前先要找到class文件。通常情况下,我们会在操作系统环境变量中配置classpath=“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;”,classpath中的“.”指的就是当前所在目录。

package cn.com.w;
class test{
    public static void main(String[] args){
        System.out.print("hello word");
    }
}

此源文件的class文件存储路径为C:\software\cn\com\w。
若是现在在C:\software\cn\com\w目录下执行java cn.com.w.test命令,那么java解释器读取到的路径为c:\software\cn\com\w\cn\com\w。就是说cn\com\w重复了。执行会报错,显示找不到或无法加载主类test。

java命令使用注意事项:

1、java执行class文件是根据CLASSPATH指定的地方来找,不是我们理解当前目录。如果希望它查询当前目录,需要在CLASSPATH中加入“.;”,代表当前目录。
2、java执行class文件,官方文档说明第一个不是命令选项的参数必须是类的全限定名称或者jar包的文件名。javac在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。

java命令官网文档:
https://docs.oracle.com/en/java/javase/16/docs/specs/man/java.html

你可能感兴趣的:(java)