【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

news2024/11/16 16:29:29

Java可执行命令详解之javac

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 语法格式
      • 3.1.1 可选参数:-d
      • 3.1.2 可选参数:-classpath
      • 3.1.3 可选参数:-sourcepath
      • 3.1.4 可选参数:-target
      • 3.1.5 可选参数:-g
  • 4️⃣ 应用场景
  • 5️⃣ 注意事项
  • 🌾 总结

在这里插入图片描述

1️⃣ 概念

Java 编程语言的可执行命令程序 javac 是 Java Development Kit (JDK) 的一部分,旨在将 Java 源代码编译为可执行的字节码文件。javac 的设计目的是为了支持 Java 的跨平台特性,使开发人员能够编写一次代码,然后在不同的操作系统上运行。

javac 是 Java 编译器的命令行前端,它将 Java 源代码作为输入,并将其转换为可由 Java 虚拟机(JVM)执行的字节码文件。它采用的是即时编译(Just-In-Time Compilation,JIT)的方式,将高级 Java 代码转换为底层机器代码。

🔍 关于Java如何实现可移植性的基本原理,请查阅我的另一篇文章:
【Java面试题】第一期:Java基础篇,每周10道,根本停不下来~

🔍 关于什么是字节码及好处是什么,请查阅我的另一篇文章:
【Java面试题】第八期:Java进阶篇,每周10道,根本停不下来~

javac 的作用是将 Java 源代码文件编译为能够在 Java 虚拟机上执行的字节码文件(以.class为扩展名)。它起到连接源代码和虚拟机之间的桥梁,将源代码转换为可执行的中间形式。

javac 在编译过程中使用了多阶段的方法。它首先将源代码解析为抽象语法树(AST),然后对 AST 进行类型检查和语义分析,最后生成中间表示形式也即字节码文件。

2️⃣ 优势和缺点

优点

  • 跨平台性:javac 生成的字节码文件可以在任何具有兼容的 Java 虚拟机的操作系统上运行;
  • 高度可移植性:通过使用 Java 编译器,Java 开发者可以创建独立于操作系统的应用程序;
  • 自动内存管理:Java 编译器为开发者提供了自动内存管理机制(垃圾回收),减少了手动内存管理的需求。

缺点

  • 开发过程中可能出现较长的编译时间,特别是对于大型项目。

3️⃣ 使用

3.1 语法格式

javac 命令的使用语法格式如下:

javac [options] <sourcefiles> 

各项的含义如下:

  • javac: 表示要运行的Java编译器命令;
  • [options]: 表示可选的参数选项。可以在这里指定不同的编译选项来控制编译过程的行为;
  • <sourcefiles>: 表示要编译的源代码文件的名称或路径。这些源代码文件应该是以.java为扩展名的Java源代码文件。

通过使用不同的编译选项,可以自定义编译过程的行为,例如指定输出目录、调整编译级别、启用特定的警告等。同时,可以传入一个或多个源代码文件,javac将会对这些文件进行编译转换为字节码文件(以.class为扩展名)。

注意,其中的方括号[]表示选项为可选的,而尖括号<>表示需要用户根据实际情况提供相应的参数值。

javac 命令支持许多可选参数来控制编译过程和生成的字节码文件。汇总全部的可选参数如下表:

参数说明
-g生成所有调试信息
-g:none不生成任何调试信息
-g:{lines,vars,source}只生成某些调试信息
-nowarn不生成任何警告
-verbose输出有关编译器正在执行的操作的消息
-deprecation输出使用已过时的 API 的源位置
-classpath <路径>指定查找用户类文件和注释处理程序的位置
-cp <路径>指定查找用户类文件和注释处理程序的位置
-sourcepath <路径>指定查找输入源文件的位置
-bootclasspath <路径>覆盖引导类文件的位置
-extdirs <目录>覆盖所安装扩展的位置
-endorseddirs <目录>覆盖签名的标准路径的位置
-proc:{none,only}控制是否执行注释处理和/或编译。
-processor [,,…]要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径>指定查找注释处理程序的位置
-parameters生成元数据以用于方法参数的反射
-d <目录>指定放置生成的类文件的位置
-s <目录>指定放置生成的源文件的位置
-h <目录>指定放置生成的本机标头文件的位置
-implicit:{none,class}指定是否为隐式引用文件生成类文件
-encoding <编码>指定源文件使用的字符编码
-source <发行版>提供与指定发行版的源兼容性
-target <发行版>生成特定 VM 版本的类文件
-profile <配置文件>请确保使用的 API 在指定的配置文件中可用
-version版本信息
-help输出标准选项的提要
-A关键字[=值]传递给注释处理程序的选项
-X输出非标准选项的提要
-J<标记>直接将 <标记> 传递给运行时系统
-Werror出现警告时终止编译
@<文件名>从文件读取选项和文件名

可以看到命令所有的可选参数很多,读者可以根据上边表格选择所需参数来执行命令。下面主要介绍几个常用的参数:

  • -d <directory>: 指定编译后的字节码文件输出目录;
  • -classpath <path>: 指定编译时查找类、接口和包的路径;
  • -sourcepath <path>: 指定查找源文件的路径;
  • -target <version>: 指定生成的字节码文件的目标 Java 版本;
  • -g: 生成用于调试的附加信息。

3.1.1 可选参数:-d

使用 -d 指定编译后字节码文件的输出目录。

运行以下命令,使用 -d 参数 指定了编译src\com\xiaoshan\MyClass.java类之后的文件输出目录为target

javac -d target src\com\xiaoshan\MyClass.java

查看编译结果,可以看到已经正确在我指定的目录下生成了MyClass.class文件:

在这里插入图片描述

3.1.2 可选参数:-classpath

-classpath <path> 参数用于指定编译时查找类、接口和包文件的路径。下面是使用命令的一个示例:

假设 MyClass.java 依赖于另一个名为 MyLibrary.jar 的外部库。而这个外部库文件 MyLibrary.jar 存储在 /path/to/lib 目录下。现在需要在编译源代码时,让 javac 命令能够正确找到并引用外部库。

使用 -classpath 选项来指定外部库的路径:

javac -classpath /path/to/lib/MyLibrary.jar MyClass.java

这将告诉 javac 命令在编译 MyClass.java 文件时,在 /path/to/lib 目录下查找额外的类文件。

通过使用 -classpath 选项,可以指定编译时所需的外部库或其他类文件的路径,使得 javac 命令在进行编译时能够正确找到并引用这些类文件,使用时根据实际情况将 <path> 替换为外部库或类文件的路径。

3.1.3 可选参数:-sourcepath

-sourcepath <path> 参数用于指定查找源文件的路径。下面是使用 javac -sourcepath <path> 命令的一个示例:

假设有一个名为 src 的目录,该目录包含了 Java 源代码文件。希望在编译源代码时,让 javac 命令能够正确找到并编译这些源文件。可以使用 -sourcepath 选项来指定源文件的路径:

javac -sourcepath src MyClass.java

这将告诉 javac 命令在编译过程中,在 src 目录下查找所需的源代码文件。

通过使用 -sourcepath 选项,可以指定用于查找源文件的路径,使得 javac 命令能够在进行编译时正确地找到和编译源代码文件。请根据实际情况将 <path> 替换为源代码文件的路径。

注意,<path> 可以是单个路径,也可以是多个路径,多个路径之间使用路径分隔符(: 在 Unix/Linux,; 在 Windows)分隔。

3.1.4 可选参数:-target

-target <version> 参数用于指定生成的Java字节码文件的目标版本。下面是使用 javac -target <version> 命令的一个示例:

希望将 MyClass.java 的源代码文件编译后的字节码文件的目标版本设置为 Java 8。则可以使用 -target 选项来指定目标版本:

javac -target 1.8 MyClass.java

这将告诉 javac 命令生成兼容 Java 8 的字节码文件。

通过使用 -target 选项,可以指定生成的字节码文件的目标版本,以确保与特定版本的Java运行时环境兼容。根据需要将 <version> 替换为所需的Java版本号。需要注意,只有支持该版本的 JDK 才能提供适当的目标编译器。

3.1.5 可选参数:-g

我们可以使用-g选项来生成包含调试信息的字节码文件,以便在调试程序时进行更详细的跟踪和分析。
以下是一个示例:

希望在编译 MyClass.java 文件时生成包含调试信息的字节码文件,使用 -g 选项来生成包含调试信息的字节码文件:

javac -g MyClass.java

通过使用 -g 选项,可以让 javac 命令在编译过程中生成带有调试信息的字节码文件。这将有助于在调试程序时进行变量跟踪、堆栈跟踪等操作。

4️⃣ 应用场景

javac 主要用于编译 Java 源代码文件,并生成可供 Java 虚拟机执行的字节码文件。
开发人员可以使用 javac 将 Java 代码转换成与特定硬件平台无关的中间表示,以便在不同的操作系统上运行。

5️⃣ 注意事项

  • 在使用 javac 前,需要首先安装正确版本的 JDK,并配置好相应的环境变量;
  • 确保 Java 源代码文件的扩展名为.java
  • 处理源代码时,确保源文件之间的依赖关系得到正确管理,以避免编译错误。

🌾 总结

javac 是 Java 编译器的命令行前端工具,用于将 Java 源代码文件编译成可在 Java 虚拟机上执行的字节码文件。它具有跨平台性、可移植性以及自动内存管理等优点,同时也存在较长的编译时间和性能损耗的缺点。

开发人员可以通过适当使用参数来控制编译过程和生成的字节码文件。javac 在编译过程中使用多阶段方法,从解析源代码到生成字节码文件。它在开发 Java 应用程序和跨平台开发方面有广泛应用,并且是 Java 开发人员的常用工具之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/697278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络原理之传输层与网络层重点协议

目录 传输层重点协议 TCP协议 TCP协议段格式 TCP原理 确认应答机制&#xff08;安全机制&#xff09; 超时重传机制&#xff08;安全机制&#xff09; 连接管理机制&#xff08;安全机制&#xff09; 滑动窗口&#xff08;效率机制&#xff09; 流量控制&#xff08;安…

力扣 257. 二叉树的所有路径

题目来源&#xff1a;https://leetcode.cn/problems/binary-tree-paths/description/ C题解1&#xff1a;使用递归&#xff0c;声明了全局变量result&#xff0c;遇到叶子节点就将字符串添加到result中。 递归三步法&#xff1a; 1. 确认传入参数&#xff1a;当前节点已有路径…

Java 泛型进阶

目录 一、什么是泛型 二、引出泛型 1、语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 4、裸类型(Raw Type) &#xff08;了解&#xff09; &#xff08;1&#xff09;说明 五、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类型数组 …

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解&#xff0c;小案例来操…

【STM32】F103(64K/128K Flash)外设概述

本文介绍的是STM32F103 中等容量产品&#xff08;STM32F103x8xx和STM32F103xBxx&#xff09;的硬件数据&#xff0c;即64KB或128KB Flash&#xff0c;20KB SRAM。 ST官网资料&#xff1a;https://www.st.com/zh/microcontrollers-microprocessors/stm32f103.html ST官方的中等…

Scala中的隐式参数、隐式函数和隐式类

使用 implicit 修饰的内容是隐式内容, 隐式的特点就是遇到适应的类型会自动的应用。隐式可以使得静态类型动态化&#xff0c;为现有类库添加功能&#xff0c;隐式的代理增强一个类或者一个方法。 隐式转化的时机 当方法中的参数的类型与目标类型不一致时当对象调用所在类中不…

HOT18-矩阵置零

leetcode原题链接: 矩阵置零 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,…

【Flutter】Flutter Redux 入门:解决状态管理的问题

文章目录 一、 前言二、 Flutter Redux 简介1. 什么是 Redux2. 为什么需要 Redux3. Flutter Redux 的作用 三、 Flutter Redux 的基本使用1. 安装和配置2. 创建 Store3. 使用 StoreProvider 四、 Flutter Redux 的基础示例1. 创建一个简单的计数器应用2. 解析代码和说明 五、 版…

解决npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher

一、问题 环境 系统&#xff1a;centos 7 node &#xff1a;v18.16.1 npm&#xff1a;9.5.1 安装pm2 npm install -g pm2提示报错&#xff1a; npm WARN deprecated uuid3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certai…

记录react 视频和 预览拖动

一、react 视频 ##1、循环播放 import React, { useEffect, useState, useRef } from "react"; const videoRef useRef(null); const showVideoClass { display: "block", width: "100%", height: "100%" } const hindVideoClass …

Zookeeper的应用场景

一、Zookeeper的应用场景包括&#xff1a; 配置中心&#xff1a;Zookeeper可以用来存储和管理配置信息&#xff0c;例如集群中的机器配置、服务地址配置等。通过Zookeeper&#xff0c;可以将配置信息统一管理&#xff0c;同时实现动态加载和更新。统一命名服务&#xff1a;Zoo…

Ubuntu 20.04.02 LTS安装virtualbox7.0

ubuntu22.04的软件仓库也有virtualbox&#xff0c;不过版本较老。 使用安装命令&#xff1a;sudo apt install virtualbox 如果想要安装最新版&#xff0c;那么需要去官网下载deb包或者使用官方的仓库。 这里采用安装Oracle官方仓库的方法。 执行如下命令&#xff1a; wge…

fastadmin 点击获取当前行数据

fastadmin 点击获取当前行数据 // 先获取当前id // 使用方法的语法&#xff1a;$(#table).bootstrapTable(method, parameter);$(document).on("click",".detailtips",function(){var ids$(this).attr("id");var rows$("#table").boo…

pytorch快速入门中文——04(训练图片分类器)

训练分类器 原文&#xff1a;https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py 就是这个。 您已经了解了如何定义神经网络&#xff0c;计算损失并更新网络的权重。 现在您可能在想&#xff0c; 数据呢&…

java小技能:分布式任务调度平台

文章目录 引言I 报表数据生成II 注意事项2.1 任务创建2.2 pom.xml 添加到maven项目 see also 引言 任务调度的应用场景&#xff1a; 生成日报、月报、定时处理任务&#xff08;定期清理文件、处理数据&#xff09; I 报表数据生成 https://kunnan.blog.csdn.net/article/deta…

你知道GPT-3带的即时学习能力是什么吗

你知道GPT-3带的即时学习能力是什么吗 在人工智能领域&#xff0c;GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;是当前比较先进的自然语言处理模型之一。它采用了自监督学习的方式进行训练&#xff0c;并且拥有强大的“in-context learning”&#xff…

nginx-rewrite

目录 1.rewrite 2.应用场景 3.跳转实现及特点 4.格式 5.location分类 6.具体应用场景 1.基于域名跳转 2.基于客户端ip访问跳转 3.基于旧域名跳转新域名后加的目录 4.基于匹配的跳转 5.基于目录下所有php结尾文件跳转 6.基于最普通一条url请求的跳转 7.总结 1.rewrite 重…

星辰秘典:揭开Python项目的神秘密码——2048游戏

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;你好&#x…

Docker 部署 jar 项目

文章目录 1、上传jar包2、新建 Dockerfile 文件3、新建 deploy.sh 脚本&#xff08;创建并运行&#xff09;4、新建 upgrade.sh 脚本&#xff08;更新&#xff09; 1、上传jar包 2、新建 Dockerfile 文件 添加jar包及修改端口 # 基础镜像 FROM java:8 # 添加jar包 ADD servic…

百度智能车竞赛丝绸之路智能车设计与编程实现控制

一、项目简介 本项目现已基于鲸鱼机器人开发套件对其整体外形进行设计&#xff0c;并且对应于实习内容——以“丝绸之路”为题&#xff0c;对机器人各个功能与机器人结构部分进行相关设计与调整。主要可以实现“车道线巡检”“音乐交际”、“城堡检测”、“翻山越岭”。 本项…