java代码编译和运行在命令行中完成

2023-10-30

背景

集成开发环境用多了,最近想学一下 java 基础,用命令行来编译和运行一下,发现举步维艰,于是,创作这篇文章与大家共享。

基础知识梳理

在写代码之前,我们先花点时间来了解一下 java 编译和运行的过程,如下图:

里面涉及到 两个 命令符:

  • javac: 将 java源文件(即 .java 文件)编译成 java字节码(即 .class文件);

                    作用:编译期就是将我们写的java源代码交给编译器执行的过程,起翻译的作用,该过程主要对java源代码的语法进行检查,如果没有语法错误,就将源代码编译成字节码文件。

  • java : 启动 JVM ,加载并运行 .class 文件

                   作用:将字节码文件(.class文件)加载到内存中交给java虚拟机执行,直到程序执行结束的过程,该过程主要对程序的逻辑错误进行检查,如果没有逻辑错误,程序的功能得到实现,输出结果。

  • 编译期和运行期的内存分配区别:①编译期只是在程序的字节码文件中产生一些控制程序运行时分配内存的指令,仅仅是知道内存分配的大小以及存放的位置,不做具体的分配操作
                                                          ②运行期才是对内存真正的分配,确定程序分配内存的大小,以及这些变量该存放内存的位置

示例代码

第一步:java代码

下面这段示例代码可以说是非常简单了,main是一个入口函数,我们在搞清楚 java 代码 编译和运行 过程的同时,也来讲解一下 args 这个字符串数组参数,

其实 args 是一个命令行参数 , 装的是用户在命令行中输入的参数。

package test;


import java.util.Arrays;

public class array {
    
    public static void main(String[] args){
        System.out.println(Arrays.toString(args));
    }
}

第二步:用 javac 编译源文件

这一步执行的前提是你环境变量配置好了。

javac test/array.java

javac 你要编译的的源文件,路径一定要搞对,否则找不到

执行完这个命令之后,你会在源文件的同级目录下发现多了一个 对应的 .class 文件

第三步:开启JVM , 运行程序

java test.array params1 params2

java 包名 [params|可选]

 

补充

不知道大家有没有注意过,你执行 " java 完整的包名 "的时候 ,你所在的目录是 src

我们可以做个试验,你返回 src 的上一层,执行 “java ./src/完整包名” 也是报 错误: 找不到或无法加载主类 ..src.test.changeData.class

这与 JVM 寻找 classpath 顺序有关。应当遵循如下寻找顺序:

现在我们假设classpath.;C:\work\project1\bin;C:\shared,当JVM在加载abc.xyz.Hello这个类时,会依次查找:

  • <当前目录>\abc\xyz\Hello.class

  • C:\work\project1\bin\abc\xyz\Hello.class

  • C:\shared\abc\xyz\Hello.class

注意到.代表当前目录。如果JVM在某个路径下找到了对应的class文件,就不再往后继续搜索。如果所有路径下都没有找到,就报错。

classpath的设定方法有两种:

在系统环境变量中设置classpath环境变量,不推荐;

在启动JVM时设置classpath变量,推荐。

我们强烈不推荐在系统环境变量中设置classpath,那样会污染整个系统环境。在启动JVM时设置classpath才是推荐的做法。实际上就是给java命令传入-classpath-cp参数:

java -classpath .;C:\work\project1\bin;C:\shared abc.xyz.Hello

或者使用-cp的简写:

java -cp .;C:\work\project1\bin;C:\shared abc.xyz.Hello

没有设置系统环境变量,也没有传入-cp参数,那么JVM默认的classpath.,即当前目录:

java abc.xyz.Hello

上述命令告诉JVM只在当前目录搜索Hello.class

有偿提问

如果大家觉得这篇文章帮助你了,可以支持一下。

有偿提问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java代码编译和运行在命令行中完成 的相关文章

随机推荐

  • Unity如何开发微信小游戏

    微信小游戏现在非常的火 很多开发Unity的同学 都想自己开发微信小游戏 无奈tiny还不成熟 导致很多同学有自己创业做微信小游戏的想法 但是由于技术 却放弃了这样的机会 今天我给大家讲述unity同学如何转型做微信小游戏 1 解放思想 我
  • angular使用websocket和Rxjs

    文章目录 前言 一 Websocket是什么 二 在服务端搭建websocket服务 三 使用rxjs中的websocketsubject 1 使用websocket 2 搭建服务 3 如何拦截到socket关闭 4 如何断线重连 5 如何
  • 运行时动态库:not found 及介绍-linux的-Wl,-rpath命令

    一 运行时动态库 not found 今天在使用linux编写c c 程序时 需要用到第三方的动态库文件 刚开始编译完后 运行提示找不到动态库文件 我就使用了ldd命令查看了一下 发现是有一个库文件显示 not found 如下图所示 库文
  • 法兰克焊接机器人编程入门_Fanuc焊接机器人编程实例

    L 11 89 IF R 2 2 JMP LBL 12 90 IF R 2 3 JMP LBL 13 91 IF R 2 4 JMP LBL 14 92 IF R 2 5 JMP LBL 15 93 IF R 2 6 JMP LBL 16
  • CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.To initi

    看起来你的shell没有正确配置使用conda activate命令 这可能是因为你在安装Anaconda时没有选择将其添加到系统路径中 解决这个问题的方法是运行conda init
  • Power BI第三方图表

    KPI类 Bullet Chart 子弹图 用来展现目标完成率 可定义红 黄 绿区域 Bullet Chart by OKViz 以垂直或水平形式展现目标达成情况 同时可以显示多个指标 Card with States by OKViz 一
  • 钉钉开放平台查询宜搭表单实例数据

    本例结合钉钉开放平台相关api实现获取宜搭表单数据 可在faas中做实现 本例采用python编写 已在本地实现 对于免登获取数据 数据归档到本地能提供参考 faas具体实现请根据实际 参考使用 采用alibabacloud dingtal
  • 【16种重要流操作】

    文章目录 前言 一 16种重要流是什么 二 输入输出流模型化 1 输入流操作 2 输出流操作 三 16种输入输出流 代码通 总结 前言 输入输出流的使用已经非常的广泛 除过采用了不同的类操作 其方法大同小异 下文针对16种重要的流进行分解
  • openEuler-22.03-LTS 安装与配置笔记

    镜像下载与安装 openEuler下载页 镜像下载 下载镜像 wget c https repo openeuler org openEuler 22 03 LTS ISO x86 64 openEuler 22 03 LTS x86 64
  • Recall, Precision, AP, mAP的计算方法(看一次就懂系列)

    Recall Precision AP mAP的计算方法 看一次就懂系列 mAP全称是mean Average Precision 这里的Average Precision 是在不同recall下计算得到的 所以要知道什么是mAP 要先了解
  • Vue的动画和过渡效果详解

    产品中优雅的交互动画可以吸引更多用户留存使用 对于前端的动画实现要求也越来越高了 在Vue中提供了一些快捷 方便的标签和内置属性来更加优雅的实现动画和过渡效果 今天我们来一起学习一下 基础动画效果 公众号 Code程序人生 个人网站 htt
  • 视频生成: 基于Stable Diffusion的微调方法

    chatGPT带来了几个月的AIGC热度 文本图像生成模型大行其道 但AI在视频生成任务上尚没有较好的开源仓库 并受限于 缺那么几百块A100 的资源问题 大多数人无法展开视频生成的研究 好在目前有不少针对视频生成的相关paper 也有不少
  • python在with open()函数中,如何在文件名设置中引用变量

    用format 函数 name wz age 25 with open C Users 0 1 txt format name age w encoding utf 8 as f1 f1 write hellow world 则文件名为 w
  • C++ 模板函数、模板类:如果没有被使用就不会被实例化

    C 中如果一个模板函数没有使用过 那么其局部静态变量都不会被实例化 class A public A edward print A ctor template
  • 【2】浅析Vue组件

    组件的基本概念 Vue中有一个概念叫做组件化 就是把页面分成一个个小的部分 每个部分有自己的功能 且可以复用 最外层的组件即根组件 除此之外会有很多子组件 子组件分为两种 全局组件和局部组件 全局组件 用 Vue component 组件名
  • 基础学习——numpy与tensor张量的转换

    系列文章目录 Numpy学习 创建数组及常规操作 数组创建 切片 维度变换 索引 筛选 判断 广播 Tensor学习 创建张量及常规操作 创建 切片 索引 转换 维度变换 拼接 基础学习 numpy与tensor张量的转换 基础学习 关于l
  • 怎么用微信打开wifi连接到服务器,微信一键连wifi在哪里 微信一键连wifi怎么使用...

    类型 社交聊天大小 45 4M语言 中文 评分 5 0 标签 立即下载 微信这款软件使用可以不用流量了 这款软件推出了wifi一键连小程序 帮助用户走到哪里都有无线网 但是有很多伙伴不知道在哪里 怎么连接 想知道的伙伴可以在西西看看相关的教
  • fiddler设置网速模拟弱网络测试

    在测试过程中 经常会要求测试弱网络情况时的一些特殊情况 这时候IOS还好说 在开发者选项中调整网络模式即可 但android就只能通过别的方式了 这里整理了通过fiddler抓包工具来设置弱网模式 在fiddler可以设置自己想要的网速 或
  • CTF练题(3) jpg图片隐写 使用jphs05工具和stegslove

    题目一概述 解题过程 1 根据题目提示 判断为图片隐写 800度的眼镜 我理解为不同色通道下观看图片 由此打开stegslove分析该图片 2 点击右方向键调整不同的色通道 发现乱码隐约组成六个字 我好喜欢你 如图 可能这六个字为本题fla
  • java代码编译和运行在命令行中完成

    背景 集成开发环境用多了 最近想学一下 java 基础 用命令行来编译和运行一下 发现举步维艰 于是 创作这篇文章与大家共享 基础知识梳理 在写代码之前 我们先花点时间来了解一下 java 编译和运行的过程 如下图 里面涉及到 两个 命令符