我使用的 Java 版本是:
java version "1.8.0_191"
代码目录结构:
ClassPathDemo.java:
package com.jiaobuchong;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
public class ClassPathDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("jack");
System.out.println(set);
System.out.println(jarTest("one"));
}
private static String jarTest(String a) {
if (StringUtils.isBlank(a)) {
return null;
}
return a.toUpperCase();
}
}
使用 javac 命令编译:

这里指定了 classpath,不然编译器没法找到 StringUtils 类。
在 test 目录下:

这什么鬼,居然报找不到或无法加载主类。我多方查询资料也无果,依赖的 jar 包目录指定了:~/test/jar/commons-lang3-3.4.jar,编译后的 class 文件目录也指定了:~/test。
经过一轮测试,原来是目录指定的有问题:

当我将 ~/test 换成绝对路径:/Users/jackchou/test就正常了,原来 classpath 指定的目录中,第二个目录不能是使用 ~,第一个目录可以。为了避免错误,classpath 都指定绝对路径 java -classpath /Users/jackchou/test/jar/commons-lang3-3.4.jar:/Users/jackchou/test com.jiaobuchong.ClassPathDemo ,可以在任何目录运行这个 Java 类。

上面这个命令要正常运行的话,需要保证 java 命令的执行是在所编译的类的目录中。
默认的 classpath 是当前目录,当自定义 classpath 的时候就会把默认的给覆盖掉,要在 classpath 中加入当前目录,直接用 . 就行。
参考:Setting the Class Path
classpath的理解及其使用方式
关于JAVA项目中CLASSPATH路径详解
JAVA和JAVAC 命令行;java 带有包名编译并运行,附带外部依赖jar包运行
本文介绍了一个Java示例程序,详细解析了如何正确设置ClassPath来包含外部依赖的jar包,并确保程序能正确编译和运行。文章通过解决一个具体问题,展示了如何避免使用~作为路径前缀可能导致的问题。
4983

被折叠的 条评论
为什么被折叠?



