命令行编译时,可以在任意目录下进行编译,只要指定目标java文件所在路径。
同样的,运行时只要指定了classpath,也可以在任意目录下运行class文件。
★在java源文件目录下编译&运行:
例如:HelloWorld.java
package com.hpe.kevin;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
①将HelloWorld.java放在C:\javacode
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Users\junzhang>cd C:\javacode
C:\javacode>dir
C:\javacode のディレクトリ
2019/05/17 13:11 <DIR> .
2019/05/17 13:11 <DIR> ..
2019/05/17 13:10 137 HelloWorld.java
1 個のファイル 137 バイト
2 個のディレクトリ 134,115,450,880 バイトの空き領域
C:\javacode>
在C:\javacode目录下,运行javac命令,不指定生成的class文件的目标文件夹(-d 选项)。
C:\javacode>javac HelloWorld.java
C:\javacode>dir
C:\javacode のディレクトリ
2019/05/17 13:13 <DIR> .
2019/05/17 13:13 <DIR> ..
2019/05/17 13:13 440 HelloWorld.class
2019/05/17 13:10 137 HelloWorld.java
2 個のファイル 577 バイト
2 個のディレクトリ 134,114,734,080 バイトの空き領域
C:\javacode>
此时,如果没有设置classpath的话,不管运行java HelloWorld或者java com.hpe.kevin.HelloWorld 都会提示找不到类的错误。
默认的classpath为当前目录。
C:\javacode>dir
C:\javacode のディレクトリ
2019/05/17 13:13 <DIR> .
2019/05/17 13:13 <DIR> ..
2019/05/17 13:13 440 HelloWorld.class
2019/05/17 13:10 137 HelloWorld.java
2 個のファイル 577 バイト
2 個のディレクトリ 134,114,734,080 バイトの空き領域
C:\javacode>SET CLASSPATH
環境変数 CLASSPATH が定義されていません
C:\javacode>java HelloWorld.class
エラー: メイン・クラスHelloWorld.classが見つからなかったかロードできませんでした
C:\javacode>java com.hpe.kevin.HelloWorld
エラー: メイン・クラスcom.hpe.kevin.HelloWorldが見つからなかったかロードできませんでした
C:\javacode>
要想正常运行HelloWord,可以将HelloWorld.class文件移动到c:\javacode\com\hpe\kevin目录下。
C:\javacode\com\hpe\kevin>dir c:\javacode
c:\javacode のディレクトリ
2019/05/17 13:22 <DIR> .
2019/05/17 13:22 <DIR> ..
2019/05/17 13:21 <DIR> com
2019/05/17 13:10 137 HelloWorld.java
1 個のファイル 137 バイト
3 個のディレクトリ 134,112,964,608 バイトの空き領域
C:\javacode\com\hpe\kevin>dir
C:\javacode\com\hpe\kevin のディレクトリ
2019/05/17 13:22 <DIR> .
2019/05/17 13:22 <DIR> ..
2019/05/17 13:13 440 HelloWorld.class
1 個のファイル 440 バイト
2 個のディレクトリ 134,112,964,608 バイトの空き領域
C:\javacode\com\hpe\kevin>
然后在c:\javacode目录下,运行命令java com.hpe.kevin.HelloWorld。
C:\javacode>java com.hpe.kevin.HelloWorld
Hello World!
C:\javacode>
另外一种方法:在编译时加上-d选项。这样,编译结束后,会在c:\javacode目录下生成com\hpe\kevin文件夹,并且HelloWorld.class文件在C:\javacode\com\hpe\kevin目录下。
C:\javacode>dir
C:\javacode のディレクトリ
2019/05/17 13:38 <DIR> .
2019/05/17 13:38 <DIR> ..
2019/05/17 13:10 137 HelloWorld.java
1 個のファイル 137 バイト
2 個のディレクトリ 134,107,607,040 バイトの空き領域
C:\javacode>javac -d . HelloWorld.java
C:\javacode>dir
C:\javacode のディレクトリ
2019/05/17 13:38 <DIR> .
2019/05/17 13:38 <DIR> ..
2019/05/17 13:38 <DIR> com
2019/05/17 13:10 137 HelloWorld.java
1 個のファイル 137 バイト
3 個のディレクトリ 134,107,471,872 バイトの空き領域
C:\javacode>dir com\hpe\kevin
C:\javacode\com\hpe\kevin のディレクトリ
2019/05/17 13:38 <DIR> .
2019/05/17 13:38 <DIR> ..
2019/05/17 13:38 440 HelloWorld.class
1 個のファイル 440 バイト
2 個のディレクトリ 134,108,250,112 バイトの空き領域
C:\javacode>
★在java源文件以外的目录编译&运行:
HelloWorld.java放在C:\javacode目录下。
C:\javacompileotherdir>dir c:\javacode
c:\javacode のディレクトリ
2019/05/17 13:38 <DIR> .
2019/05/17 13:38 <DIR> ..
2019/05/17 13:38 <DIR> com
2019/05/17 13:10 137 HelloWorld.java
1 個のファイル 137 バイト
3 個のディレクトリ 134,105,608,192 バイトの空き領域
C:\javacompileotherdir>dir
C:\javacompileotherdir のディレクトリ
2019/05/17 13:48 <DIR> .
2019/05/17 13:48 <DIR> ..
0 個のファイル 0 バイト
2 個のディレクトリ 134,105,608,192 バイトの空き領域
C:\javacompileotherdir>
将HelloWorld.java编译到C:\javacode\class目录下。※事先在C:\javacode下建好class目录。
C:\javacompileotherdir>javac -d c:\javacode\class c:\javacode\HelloWorld.java
C:\javacompileotherdir>dir c:\javacode\class\com\hpe\kevin
c:\javacode\class\com\hpe\kevin のディレクトリ
2019/05/17 14:08 <DIR> .
2019/05/17 14:08 <DIR> ..
2019/05/17 14:08 440 HelloWorld.class
1 個のファイル 440 バイト
2 個のディレクトリ 134,106,296,320 バイトの空き領域
C:\javacompileotherdir>dir
C:\javacompileotherdir のディレクトリ
2019/05/17 13:48 <DIR> .
2019/05/17 13:48 <DIR> ..
0 個のファイル 0 バイト
2 個のディレクトリ 134,106,296,320 バイトの空き領域
C:\javacompileotherdir>
在未设置classpath的情况下,运行HelloWorld。
C:\javacompileotherdir>SET CLASSPATH
環境変数 CLASSPATH が定義されていません
C:\javacompileotherdir>java -cp c:\javacode\class com.hpe.kevin.HelloWorld
Hello World!
C:\javacompileotherdir>
事先设置好classpath的话,可以这么运行:
C:\javacompileotherdir>SET CLASSPATH
環境変数 CLASSPATH が定義されていません
C:\javacompileotherdir>SET CLASSPATH=.;c:\javacode\class
C:\javacompileotherdir>SET CLASSPATH
classpath=.;c:\javacode\class
C:\javacompileotherdir>java com.hpe.kevin.HelloWorld
Hello World!
C:\javacompileotherdir>
或者,切换到c:\javacode\class后运行HelloWorld
C:\javacompileotherdir>cd c:\javacode\class
c:\javacode\class>java com.hpe.kevin.HelloWorld
Hello World!
c:\javacode\class>
★结论:
1. javac编译时,在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件(即javac认识文件系统)。如果编译时没有加-d选项指定生成后的class文件目标路径,那么,编译后,在.java同路径目录下生成class文件。
2. 默认java虚拟机要从classpath环境变量的路径中搜索class文件去执行,对于java虚拟机来说,这不是类文件,而是类。它只有类路径,而没有文件系统路径。而classpath环境变量正是为java虚拟机提供搜索类路径的环境。注意,虚拟机不会递归搜索classpath定义的路径。
3. 要明确的是javac编译器搜索的是文件路径,和环境变量classpath无关。而java虚拟机搜索的是类文件,严格地说是类,搜索路径由环境变量classpath决定,且有先后顺序。