Java中-cp与-classpath选项的区别及执行报错问题咨询
Java中
-cp与-classpath选项的区别及问题排查 问题场景
在非/home/root目录下使用-classpath选项执行Java应用时,抛出以下错误:
java.lang.UnsatisfiedLinkError: no
in java.library.path
执行命令示例(示例1):
java -Djava.library.path=. -classpath ".:<.jar files path>:</java application directory/>" <java main class name>
但在/home/root下任意目录使用-cp选项的命令却能正常运行:
java -Djava.library.path=. -cp ".:<.jar files path>:</java application directory/>" <java main class name>
-cp与-classpath的本质区别
-cp和-classpath是完全等价的命令行选项,二者功能完全一致,-cp只是-classpath的简写形式,不存在任何功能上的差异。
问题根源分析
既然两个选项没有区别,问题出在执行环境和代码逻辑上:
类路径的相对路径解析问题
你命令中的类路径包含相对路径.(当前工作目录),当在非/home/root目录下执行时:- 如果
</java application directory/>是相对路径,会基于当前工作目录解析,可能找不到主类所在目录,导致类加载失败,进而触发后续错误提示(错误信息存在误导性); - 在
/home/root下执行时,相对路径能正确解析到目标类文件或目录,程序正常运行。
- 如果
Native库加载的误导性关联
你的代码中是通过绝对路径加载Native库的:class enGraph{ static { // 加载Unix平台下的libepdgraph.so库 File lib = new File("/home/root/" + System.mapLibraryName("enGraph")); System.load(lib.getAbsolutePath()); } }这段逻辑依赖绝对路径,和
java.library.path无关(你没有用依赖该路径的System.loadLibrary),所以报错信息里的java.library.path相关提示是误导,核心问题还是类路径解析失败。
解决建议
- 将类路径中的相对路径全部替换为绝对路径,确保在任何目录下执行都能正确找到类和Jar包;
- 若报错信息仍有误导,可添加
-verbose:class参数开启类加载日志,定位具体加载失败的类; - 移除冗余的
-Djava.library.path=.配置,因为你的Native库加载逻辑并未用到该路径。
内容的提问来源于stack exchange,提问作者Guru Kiran
相关产品推荐
相关产品推荐

