java和javac编译运行java程序

java和javac编译运行java程序目录目录前言编译命令介绍javacjava代码编译与运行java类发现规则分离class和java文件参考链接前言给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的。但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!!我的原则不能抱怨太多,像个Loser,不会的就花时间补回来。下面,主要是总结一些如何在

大家好,又见面了,我是你们的朋友全栈君。

目录


前言

给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的。

但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!!

我的原则不能抱怨太多,像个Loser,不会的就花时间补回来

下面,主要是总结一些如何在命令行中编译java程序。主要是想记录总结一下java的类发现原则


编译命令介绍

其实,java编译过程主要使用了javac和java两个命令。这里先介绍一下这两个命令的使用方法。


javac

javac用于将java文件编译成byte-code class文件。使用方法如下:

javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]

其中options有几个关键参数:

  • -d:指定编译成的class文件的存放位置。默认情况下,编译生成的class文件和源java文件在同一目录下。
  • -classpath(-cp):用于搜索编译所需要的class文件,指出编译所用到的class文件的位置。

java

java用于执行程序,格式如下:

java [options] classfile

其中,options一般需要指定-classpath参数,用于指定要执行的文件所在的位置以及需要用到的类的路径。


代码编译与运行

这里介绍一个带package的测试用例。以前大家在学习javac编译的时候,都是在默认包下进行的编译,一般不会出问题,但是遇到带package的类就不一样了。
示例目录结构如下:
jvm_directory

其中,src是默认的package目录。我们在src/jvm目录下增加两个测试文件,内容如下:

  1. src/jvm/CompileClass.java
package jvm;

public class CompileClass { 
   
    public static void main(String[] args) {
        TestClass1 mTestClass1 = new TestClass1();
        mTestClass1.sayHello();
    }
}
  1. src/jvm/TestClass1.java
package jvm;

public class TestClass1 { 
   
    public void sayHello() {
        System.out.println("Hello World!");
    }
    public static void main(String[] args) {
        TestClass1 mTestClass1 = new TestClass1();
        mTestClass1->sayHello();
    }
}

这时,如果直接在src/jvm目录下,用javac编译CompileClass,报错如下:
error_javac

我想平时大家写完这么简单的代码,用Ecplise点一下run按钮是不可能遇到这种问题的。那之所以会遇到这个问题,就是由于Ecplise这种编译器替我们掩盖了java是有类发现规则的。


java类发现规则

要想成功的编译和执行java文件,是需要有classpath和包名的共同配合。

我们先尝试禁用一下classpath,禁用的方法是在运行javac的时候,指定
-classpath ""

在src/jvm目录下,我们禁用classpath,编译TestClass1.java:

javac -classpath "" TestClass1.java

大家执行之后,发现是可以编译通过的(至于能否执行大家先不要在意)。

但是,同样在src/jvm目录下,我们禁用classpath去编译CompileClass.java,是无法编译通过的,编译错误和之前是一样的。之所以ComplieClass.java无法编译通过,是因为ComplieClass.java的源码中调用了TestClass1这个类,而禁用掉classpath之后,javac无法找到TestClass1了。由此,我们可以总结出如下规律:

当你需要编译(或执行)的类A引用了其他的类如B时,编译器需要在-classpath指定的目录下去找B
当类B中也指定了package时,那B的路径path=classpath + “/” + package(将所有的”.”转换为”/”)

因此,在src/jvm目录下,为了能让ComplieClass.java在编译时能够找到TestClass1这个类,我们需要这样设置classpath:

javac -classpath ".." CompileClass.java

执行的时候,命令如下:

java -classpath ".." jvm.CompileClass

分离.class和.java文件

在了解了java类发现规则之后,我们应该再去优化一下我们的编译方法。

参考Eclipse,它在java项目的根目录下,分别创建了一个src目录和一个bin目录。其中:

  • src目录:存放所有的.java文件。
  • bin目录:存放所有的编译出来的.class文件。

我们可以很轻松的通过-d参数指定目录实现该功能。并且,当我们这么做的时候,bin目录生成的.class文件都保持了src目录的相应结构,我们就不用再去费心考虑classpath查找类的问题了。

示例过程如截图所示:
compile_process


参考链接

[1] Mastering the JAVA CLASSPATH

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142047.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 查看Linux系统版本信息

    查看Linux系统版本信息扫码关注获取更多IT知识在使用Linux操作系统的时候,有时候会需要了解当前使用的系统版本信息,特别是在给别人进行服务器部署运维的时候,准确的系统版本信息至关重要,今天明月就给大家分享几个获取Linux系统版本信息的命令。一、查看Linux内核版本命令(两种方法):1、cat/proc/version[root@S-CentOShome]#cat/proc/versionLinuxversion2.6.32-431.el6.x86_64(mockbuild@c6b8.bsys.

    2022年6月5日
    36
  • ES6数组方法find()、findIndex()的总结「建议收藏」

    ES6数组方法find()、findIndex()的总结「建议收藏」本文主要讲解ES6数组方法find()与findIndex(),关于JS的更多数组方法,可参考以下:①JavaScript内置对象之-Array②ES5新增数组方法(例:map()、indexOf()、filter()等)③ES6新增字符串扩张方法includes()、startsWith()、endsWith()1.find()该方法主要应用于查找第一个符合条件的数组元素,即…

    2022年6月13日
    79
  • SynchronousQueue用例「建议收藏」

    SynchronousQueue用例「建议收藏」SynchronousQueue是无缓冲区的阻塞队列,即不能直接向队列中添加数据,会报队列满异常,如下所示:importjava.util.concurrent.SynchronousQueue;publicclassSynchronousQueueExp{ publicstaticvoidmain(String[]args){ SynchronousQueu…

    2022年6月22日
    30
  • windows cmd命令大全及详解_win10 cmd命令

    windows cmd命令大全及详解_win10 cmd命令命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。在不同的操作系统环境下,命令提示符各不相同。在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统。一、启动CMD命令提示符控制器“开始”→“运行”→输入“cmd”回车;或者:win+R(两个键同时按)打开“运行”窗口→输…

    2022年9月22日
    4
  • linux安装rabbitmq教程(rabbitmq中文文档)

    一、准备依赖包yuminstallbuild-essentialopensslopenssl-develunixODBCunixODBC-develmakegccgcc-c++kernel-develm4ncurses-develtktcxz二、下载erlang-18.3-1wgetwww.rabbitmq.com/releases/erlang…

    2022年4月11日
    140
  • PyCharm社区版安装教程和环境配置及使用[通俗易懂]

    PyCharm社区版安装教程和环境配置及使用[通俗易懂]一、PyCharm官网下载访问官网地址:https://www.jetbrains.com/pycharm/点击首页【Download】按钮,进入下载页面,选择Community下的【Download】,如图:点击后进入“ThankyoufordownloadingPyCharm!”页面,选择“另存为”,如图:选择本地目录路径,点击【保存】,开始下载:双击本地的PyCharm安装包,进入安装首页,点击【Next>】按钮,如图:进入“ChooseInstallLocati

    2022年8月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号