在/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
成功执行,为什么???
答案 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标头中不接受类路径通配符。