java类路径中,/*和./*之间有什么不同

java类路径中,/*和./*之间有什么不同,java,Java,在/home/wangming目录中,我编写了一个简单的java源代码Test.java 导入com.alibaba.fastjson.JSONObject; 导入java.util.concurrent.TimeUnit; 公开课考试{ 公共静态void main(字符串[]args)引发InterruptedException{ JSONObject json=新的JSONObject(); 时间单位。小时。睡眠(1); } } 我将fastjson-1.2.11.jarint放入目录(类

/home/wangming
目录中,我编写了一个简单的java源代码
Test.java

导入com.alibaba.fastjson.JSONObject;
导入java.util.concurrent.TimeUnit;
公开课考试{
公共静态void main(字符串[]args)引发InterruptedException{
JSONObject json=新的JSONObject();
时间单位。小时。睡眠(1);
}
}
我将
fastjson-1.2.11.jar
int放入目录(类路径),然后执行

[root@root王明]#javac-cp./*Test.java
javac:无效标志:./Test.class
用法:javac
使用-help获取可能选项的列表
[root@root王明]#javac-cp。Test.java
Test.java:2:错误:包com.alibaba.fastjson不存在
导入com.alibaba.fastjson.JSONObject;
^
Test.java:9:错误:找不到符号
JSONObject json=新的JSONObject();
^
符号:类JSONObject
地点:班级考试
Test.java:9:错误:找不到符号
JSONObject json=新的JSONObject();
^
符号:类JSONObject
地点:班级考试
3个错误
[root@root王明]#javac-cp.:./Test.java
Test.java:2:错误:包com.alibaba.fastjson不存在
导入com.alibaba.fastjson.JSONObject;
^
Test.java:9:错误:找不到符号
JSONObject json=新的JSONObject();
^
符号:类JSONObject
地点:班级考试
Test.java:9:错误:找不到符号
JSONObject json=新的JSONObject();
^
符号:类JSONObject
地点:班级考试
3个错误
[root@root王明]#javac-cp.:/*Test.java

只有
javac-cp.:./*Test.java
成功执行,为什么???

您正在添加
,这意味着当前目录下的所有类,
/*
意味着也要查看当前目录中的所有jar/zip文件

正如Jean Francois指出的那样,
/*
可以单独扩展到目录中的每个文件


我强烈建议您使用IDE和maven/gradle等构建工具来设置和构建项目,您将重点放在编写代码上,而不是如何使其构建/运行。

您正在添加
,这意味着当前目录下的所有类,
/*
意味着查看当前目录中的所有jar/zip文件目录

正如Jean Francois指出的那样,
/*
可以单独扩展到目录中的每个文件


我强烈建议您使用IDE和maven/gradle等构建工具来设置和构建项目,您将重点放在编写代码上,而不是如何使其构建/运行。

问题在于Unix/Linux shell会扩展。/*扩展到与之匹配的任何内容,例如
/Test.java

做你所做的:

javac -cp .:./* Test.java
禁用shell匹配,shell不再解释通配符=>它可以工作

这意味着这也会起作用:

javac -cp "./*" Test.java

注意:在windows端没有问题,windows shell不像Linux/Un*x那样扩展通配符。

问题是Unix/Linux shell会扩展。/*到任何匹配的对象,例如
/Test.java

做你所做的:

javac -cp .:./* Test.java
禁用shell匹配,shell不再解释通配符=>它可以工作

这意味着这也会起作用:

javac -cp "./*" Test.java

注意:在windows方面没有问题,windows shell没有像Linux/Un*x那样扩展通配符。

我会尽量简单一些。您正在导入一个.jar文件。 因此,您必须让计算机搜索.jar文件才能运行您的应用程序

写入命令行时,请执行以下操作:

    javac -cp . Test.java
这意味着“执行javac(编译器),使类路径成为我所在的目录,并查找.java文件(这就是“.”(点)所表示的),如果找到Test.java文件,则编译它”

当需要声明多个类路径时,应执行以下操作:

-for Windows: path1; path2; path3 (the ";" is the delimiter)

-for Unix systems: path1:path2:path3 (the ":" is the delimiter)
因此,通过写作:

    javac -cp .:./* Test.java
这意味着:

    -execute javac (compiler), 

    -make the classpath
       1) the directory where I am in and look for .java files 
       2) + look in this directory for .jar files (that is what the "./*" represents,

    -and if you found Test.java file, compile it".
这就是代码工作的原因。您要求计算机在当前目录中查找.java文件和目录中的所有.jar文件

请参阅以下文档以供参考:

类路径通配符 类路径项可以包含基名称通配符(),这被认为等同于指定目录中所有文件的扩展名为.jar或.jar的列表。例如,类路径条目mydir/指定名为mydir的目录中的所有JAR文件。由*组成的类路径项扩展为当前目录中所有jar文件的列表。无论文件是否隐藏(名称以“.”开头),都会考虑这些文件

包含星号()的类路径项与类文件不匹配。要匹配单个目录mydir中的类和JAR文件,请使用mydir:mydir/或mydir/*:mydir。选择的顺序决定了mydir中的类和资源是在mydir中的JAR文件之前加载,还是在mydir中的JAR文件之前加载

子目录不是递归搜索的。例如,mydir/*只在mydir中搜索JAR文件,而不在mydir/subdir1、mydir/subdir2等中搜索

在扩展类路径中枚举目录中的JAR文件的顺序没有指定,并且可能因平台而异,甚至在同一台机器上每时每刻都不同。构造良好的应用程序不应依赖于任何特定的顺序。如果需要特定的顺序,那么可以在类路径中显式枚举JAR文件

在类加载过程中,通配符的扩展在调用程序的主方法之前提前完成,而不是延迟。输入cl的每个元素