java classpath中./*和。:./ *之间的区别是什么

时间:2016-08-25 12:08:26

标签: java

/home/wangming dirctory中,我写了一个简单的java源Test.java

import com.alibaba.fastjson.JSONObject;
import java.util.concurrent.TimeUnit;
public class Test {
    public static void main(String[] args) throws InterruptedException {
        JSONObject json = new JSONObject();
        TimeUnit.HOURS.sleep(1);
    }
}

我将fastjson-1.2.11.jar放在目录(类路径)中,然后执行

[root@root wangming]# javac -cp ./* Test.java
javac: invalid flag: ./Test.class
Usage: javac <options> <source files>
use -help for a list of possible options
[root@root wangming]# javac -cp . Test.java
Test.java:2: error: package com.alibaba.fastjson does not exist
import com.alibaba.fastjson.JSONObject;
                           ^
Test.java:9: error: cannot find symbol
                JSONObject json = new JSONObject();
                ^
  symbol:   class JSONObject
  location: class Test
Test.java:9: error: cannot find symbol
                JSONObject json = new JSONObject();
                                      ^
  symbol:   class JSONObject
  location: class Test
3 errors
[root@root wangming]# javac -cp .:./ Test.java
Test.java:2: error: package com.alibaba.fastjson does not exist
import com.alibaba.fastjson.JSONObject;
                           ^
Test.java:9: error: cannot find symbol
                JSONObject json = new JSONObject();
                ^
  symbol:   class JSONObject
  location: class Test
Test.java:9: error: cannot find symbol
                JSONObject json = new JSONObject();
                                      ^
  symbol:   class JSONObject
  location: class Test
3 errors
[root@root wangming]# javac -cp .:./* Test.java 

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

3 个答案:

答案 0 :(得分:2)

问题是Unix / Linux shell将./*扩展为匹配实例./Test.java

的任何内容

做你做的事:

javac -cp .:./* Test.java

禁用shell匹配,shell不再解释通配符=&gt;它有效。

这意味着这也可行:

javac -cp "./*" Test.java

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

答案 1 :(得分:1)

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

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

我强烈建议您使用IDE和maven / gradle等构建工具来设置和构建项目,并专注于编写代码而不是如何构建/运行代码。

答案 2 :(得分:0)

我会尝试变得非常简单。您正在导入.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文件。

请参阅以下文档,以供参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html

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

包含星号()的类路径条目与类文件不匹配。要在单个目录mydir中匹配类和JAR文件,请使用mydir:mydir / 或mydir / *:mydir。选择的顺序确定mydir中的类和资源是否先于mydir中的JAR文件加载,反之亦然。

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

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

通配符的扩展在类加载过程中尽早(而不是在程序的主要方法被调用之前)完成。包含通配符的输入类路径的每个元素都由(可能为空)元素序列替换,这些元素序列是通过枚举命名目录中的JAR文件而生成的。例如,如果目录mydir包含a.jar,b.jar和c.jar,则类路径mydir / *扩展为mydir / a.jar:mydir / b.jar:mydir / c.jar,并且该字符串将是系统属性java.class.path的值。

CLASSPATH环境变量与-classpath或-cp选项没有任何区别。在所有这些情况下都应使用通配符。但是,Class-Path jar-manifest标头中不接受类路径通配符。