美文网首页
Java ClassPath 的秘密

Java ClassPath 的秘密

作者: 靖阿 | 来源:发表于2017-12-27 10:20 被阅读0次

写了一段简单的测试代码

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);
    }
}

然后分别执行

[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 

Setting the class path这篇文章中, 说classpath 可以是以下三种形式

  • jar包(.jar结尾的文件) 里面包含了class文件
  • zip包(.zip结尾的文件) 里面包含了class文件
  • 目录(文件夹) 如果class文件里有package, 那么目录里一定要有和package相应的目录结构

如果一个classpath中包含了通配符(*), 那么Java就不会在这个目录下搜索class文件了.

例如lib/*, 如果classpath是这个, 那么classpath就只会在lib目录下搜索jar文件, 然后从jar文件中去加载class, 如果想要在lib目录下既搜索jar文件也搜索class文件的话, 那么可以写成lib:lib/*或者lib/*:lib.

还有一点很重要的是, 如果lib目录下有子目录的话lib/jetty的话, Java是不会进行递归搜索子目录的。

说到这里, Java为什么不会在lib/*下搜索class文件呢?是这样的, 如果lib目录下有a.jarb.jar, 其实现在的lib/*就被替换成了lib/a.jar:lib/b.jar. 我们可以在Java的系统变量里看到这个结果.

看到这,我们应该就推断出上面错误的原因了, .只会搜索class文件但是不会搜索jar, 而*通配符则自动帮我换成了jar文件的classpath的替换.

安装上JDK后, 系统会自动设置一个CLASSPATH的环境变量(.:/home/jdk1.8/lib/dt.jar:/home/jdk1.8/lib/tools.jar), 但是当运行Java命令, 指定-cp的时候,会覆盖掉这个classpath, 所以在新的classpath上一定要指定.

classpath适用于下列工具
JDK Tools and Utilities

How Classes are Found

相关文章

  • Java ClassPath 的秘密

    写了一段简单的测试代码 然后分别执行 在Setting the class path这篇文章中, 说classpa...

  • 六号线晚报0705

    天气:晴 风力:无风 java命令 -classpath -classpath和-cp都是java命令的选项,添加...

  • Java之classpath

    CLASSPATH是JAVA中一个重要概念,新手很产生迷惑,CLASSPATH是什么呢? CLASSPATH就是环...

  • win10Java配置

    Java_HOME CLASSPATH PATH

  • Java ClassPath

    Java class path 最近遇到了两个问题 设置 Atom 的 auto complete 的时候发现需要...

  • Java classpath

    一、类加载器与classpath 以下为系统中的三种类加载器,每个类加载器都有自己用来寻找类文件的路径。其中系统类...

  • Java .classpath文件Classpath entry

    在实际用Maven构建Java Web项目开发过程中,有时候会出现上述情况的警告,如果不解决这个警告,就会在启动W...

  • Java环境变量搭建

    Java 环境变量搭建 JAVA_HOME PATH %JAVA_HOME%\bin; CLASSPATH .;%...

  • (Ecilpse开发工具)JDK环境跟系统设置+tomcat环境

    classpath=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_...

  • 环境配置

    CLASSPATH:.;%JAVA_HOME%\lib;JAVA_HOME:D:\Java\jdk1.8.0_19...

网友评论

      本文标题:Java ClassPath 的秘密

      本文链接:https://www.haomeiwen.com/subject/flwygxtx.html