在命令行中使用java来运行java程序,搜索类的过程分为以下3步:
1 搜索系统类,大部分都位于JAVA_HOME/jre/lib/rt.jar中
2 搜索扩展类,即那些位于JAVA_HOME/jre/lib/ext下的.jar文件中的类
3 搜索用户类路径 即环境变量CLASSPATH或者在命令行中由java指令的-cp选项指定,如果不指定-cp,那么CLASSPAT环境变量起作用;如果指定了-cp,那么只有-cp指定的类路径起作用。
注意:搜索系统类和扩展类是java虚拟机自动进行的,换句话说,即使环境变量CLASSPATH和java指令的-cp选项没有指定这两个路径,java虚拟机也会自动搜索。
下面以一个具体例子来说明,结合import语句,某一个类是如何被找到的。
假设在d:example\src文件夹下存放着java程序的源文件,文件层次结构如下:
d:\example\src\test\A.java
d:\example\src\test\B.java
这两个源文件的代码如下:
package test; import java.util.*; public class A { public static void main(String[] args) { Date date = new Date(); B.say(); } }
package test; public class B { public static void say() { System.out.println("Hello"); } }
假设已经编译好了,在d:\example\classes文件下存放着要运行的类文件,其中A.class和B.class都位于test包中,文件层次结构
如下:
d:\example\classes\test\A.class
d:\example\classes\test\B.class
要运行这个程序,在命令行中切换到d:\example目录,即
然后,键入如下命令:
运行程序后就会输出Hello字符串。
其中类的搜寻过程如下:
1 为了找到A.class,虚拟机首先搜索系统类路径和扩展类路径但是找不到,接着搜索用户类路径,由于在java指令中使用了-cp选项,因此,虚拟机以当前工作目录(即命令行调用java指令时所在目录d:\example) + -cp指定的路径(classes) + 包名(test)构成的路径下搜索,d:\example\classes\test下搜索A.class,结果能够找到A.class(-cp所给的相对路径是相对于当前工作目录的,也可以指定绝对路径)
2 A.class引用了Date类,由于在使用Date类时没有指定Date类所在包,那么,虚拟机搜索时会结合所有的import语句,这里import语句java.util.*。
虚拟机在搜索系统类路径时,根据import语句,在JAVA_HOME/jre/lib/rt.jar/java/util文件夹下找到Date类
3 A.class引用了B.class,由于在使用B类时没有指定B类所在包,那么虚拟机搜索时会结合所有的import语句,这里import语句为java.util.*。但是虚拟机无论是结合import语句搜索系统类路径和扩展类路径,还是结合import语句搜索
用户类路径都找不到B.class,这时虚拟机会根据A.class所在的包(test)来构造路径搜索,在d:\example\classes\test中找到B.class文件。
注意:在第3步搜索B.class时,如果在A.java源文件中添加import test.*;语句也是可以的。
在命令行中用javac编译java源文件,javac既搜索类文件(过程和java指令一样),也搜索java源文件。以在命令行中编译d:\example\src\test\A.java
为例,只要键入以下命令即可:
javac会进行如下搜索,
1 搜索源文件A.java,首先从当前工作目录(即运行javac指令时命令行所处的
目录,即d:\example),结合指定的源文件路径(src/test)搜索A.java,结果
在d:\example\src\test下发现A.java
2 搜索Date类,搜索Date类和java指令中搜索一样,结合import语句,最终
在系统类路径JAVA_HOME/jre/lib/rt.jar/java/util下找到Date.class
3 搜索B.java源文件,源文件的搜索路径由-sourcepath指定,具体搜索过程为,结合所有import语句搜索,即搜索d:\example\src\java\util,不能搜索到B.java,在结合A.java声明的包(test)进行搜索,即搜索d:\example\src\test,结果找到B.java(-sourcepath指定的相对路径也是相对于当前目录的,也可以指定绝对路径)
注意:
1 javac也可以有-cp选项,作用和java指令中的一样
2 如果javac指定了-cp没有指定-sourcepath,那么-cp既起到指定用户类路径的作用,也起到指定源文件搜索路径的作用;但是如果javac既指定了-cp,又指定了-sourcepaht,那么-cp只起到指定用户类路径的作用,-sourcepath只起到指定源文件搜索路径的作用
3 javac的-d选项指定生成的类文件存放位置,这里存放于(d:\example\classes)
相关推荐
Java 和 javac 命令是 Java 语言的基本组成部分,它们在 Java 应用程序的编译和执行过程中扮演着重要的角色。javac 命令用于编译 Java 程序源代码,生成字节码文件,而 java 命令用于执行已经编译的字节码文件。 ...
**WSDL2Java命令使用详解** 在Web服务开发中,WSDL(Web Service Description Language)是一种XML格式,用于定义服务接口、操作、消息结构等。它使得服务提供者和服务消费者可以进行互操作。Apache Axis是Java平台...
本文将从给定文件的标题和部分内容中提取出与Java命令相关的知识点。 首先,Java的可执行文件通常位于Java开发工具包(JDK)的bin目录中。这个目录下包含了多个重要的命令行工具,其中一些我们可以在给定文件的部分...
Java命令大全涵盖了几个重要的工具,它们是Java开发者日常工作中不可或缺的部分。...了解和掌握这些基本的Java命令,对于软件开发人员来说,无论是新手还是资深开发者,都是提高工作效率的重要步骤。
本文总结了 JDK 中的各种命令,包括 javac、java、javah、jdb 等,详细介绍了 JDB 调试工具的使用方法和命令列表。通过学习这些命令,可以更好地学习和使用 Java 语言。 一、JDK 命令简介 JDK 中提供了许多实用的...
java命令大全.doc
Java命令主要包括编译、运行、调试、性能监控等多个方面,其中`javac`用于编译源代码,`java`用于执行已编译的字节码,而`jps`、`jstat`等工具则用于系统监控和故障排查。本文主要关注`java`命令的高级用法,特别是...
java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用...
2. java命令的用法:java命令用于运行.class文件。需要注意的是,如果源代码中声明了包,必须使用类的完整限定名来运行类。如果源代码文件中首行定义了package,如package com.stopTalking.test,则在运行时需要指定...
Java 命令是 Java 环境变量设置中的重要命令,包括 JAVA 命令和 JAVAC 命令。JAVA 命令用于运行 Java 程序,而 JAVAC 命令用于编译 Java 程序。 六、Hello World 程序 Hello World 程序是 Java 环境变量设置的示例...
用java语言实现windows dos的调用,通过输入dos命令,执行相应的结果
Java调用doc命令主要涉及到的是Java的进程操作和命令行接口。在Windows操作系统中,`.doc`文件通常是由Microsoft Word创建的文档。然而,“doc命令”可能是指通过命令行(CMD)来操作或处理这些文档的方式,比如使用...
通过这部分的介绍,读者应当能够理解和掌握在不同操作系统平台上使用javac和java命令来编译和运行Java程序的基本方法和注意事项。同时,也应当能够清晰地理解-classpath和-sourcepath选项的具体作用及其在解决类和...
创建`ProcessBuilder`实例后,通过`command()`方法添加命令和参数,然后调用`start()`方法执行。 ```java ProcessBuilder pb = new ProcessBuilder("ls", "-l"); pb.directory(new File("/home/user")); // 设置...
《在EditPlus中配置javac和java命令》 在IT行业中,编辑器是开发者的重要工具,而EditPlus作为一款功能强大的文本编辑器,因其简洁的界面、高效的代码编写功能以及丰富的自定义设置,深受广大程序员的喜爱。然而,...
在Java中,命令模式的应用非常广泛,尤其在需要解耦调用者和接收者时。 命令模式的核心组成部分包括:**命令接口**、**具体命令类**、**接收者**和**调用者**。 1. **命令接口**:定义了一个接收者需执行的操作,...
当遇到“java能执行,javac不能执行”的情况时,通常意味着系统能够找到并运行Java解释器(即java命令),但无法定位到javac编译器。这背后可能有以下几种原因: 1. **PATH环境变量配置不全**:在Windows操作系统中...
`jar` 命令用于创建、提取和更新.jar文件,这是Java的二进制文件格式,用于打包多个类文件和资源。创建一个包含`HelloWorld.class`的.jar文件,你可以使用: ``` jar cvf HelloWorld.jar HelloWorld.class ``` ...
在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...