2025年java和javac编译运行java程序

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

目录

目录

前言

编译命令介绍

javac

java

代码编译与运行

java类发现规则

分离class和java文件

参考链接

前言

给自己定了一个月学习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的类就不一样了。
示例目录结构如下:

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

src/jvm/CompileClass.java

package jvm;

public class CompileClass {

public static void main(String[] args) {
TestClass1 mTestClass1 = new TestClass1();
mTestClass1.sayHello();
}
}

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,报错如下:

我想平时大家写完这么简单的代码,用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查找类的问题了。

示例过程如截图所示:

参考链接

[1] Mastering the JAVA CLASSPATH

编程小号
上一篇 2025-01-16 14:11
下一篇 2025-01-16 14:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/148953.html