一篇文章搞定 java 中的 path 和 classpath
Path 作用
设置 path 是为了方便使用 java、javac等这些命令而不用写全路径。
如:

Classpath 的作用
jar 包的搜索路径,告诉应用程序去哪里寻找 class。默认为当前目录。在实际的应用时,一般不需要设置 classpath。
Classpath的使用方式
通配符
匹配所有 .jar 或者 .JAR
匹配所有 .jar或者.JAR以及 class files (如:cat.class)
直接通过 jar 包
加载 class files
( 可以忽略,在实际项目中根本不会用这种方式,因为有 idea 等工具的存在,所以重点来体会一下工具为我们做了什么 )
目录结构

Java类不存在包引用

Java类存在包引用


Java类存在包引用,通过指定 classpath 来执行

Java class 之间相互引用并通过命令行执行
通过 Test1.java 引用 Test2.java

Java class 引入第三方 jar 包并通过命令行执行
在 Test1 中引入第三方的依赖 kudu

Classpath的应用场景
打包是没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)
要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主类名称(绝对路径)
Idea等工具究竟为我们做了什么
通过 Classpath的使用方式 我们知道了在命令行执行代码是何等的麻烦,而当我们使用idea的时候只需要

就可以运行一个包含 main 方法的 .java 文件,这是何等的简单。可是为什么呢?为什么这样就可以执行了?
通过上面的例子我们可以知道,要想正常的编译执行 .java 文件,需要两个条件:
必须的 jar 包,一部分是 JVM 所必须的 jar, 一部分是依赖的第三方包。
class files 的正确路径
那么我们就来看一下 idea 是否满足这两个条件。
首先必须要有必须的 jar 这是 JVM 所必须的 jar

我们所依赖的 jar 也都被放进了 classpath,这也省的我们自己去手动一个个指定。

所以基本 jar 依赖的问题就解决了,
其次,我们需要正确的 class files 路径。

设置了 build 后的路径为 ${PROJECT_ROOT}/target。

设置了 target 的文件路径。通过这两个设置,保证我们自己写的.java 文件的正确路径。至此我们执行

它就可以正确的跑起来了。
参考
https://docs.oracle.com/javase/tutorial/essential/environment/paths.html
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html
补充
就在刚刚我还好奇为什么一些程序,比如 Flink 。竟然可以不通过 java -jar 或者 java -cp 主方法 的方式来执行( 其实是通过 java -cp 主方法 的方式来执行的)。
我们修改一下 Flink 的启动脚本
然后我们在执行一下,看看会发生什么?
版权声明: 本文为 InfoQ 作者【shengjk1】的原创文章。
原文链接:【http://xie.infoq.cn/article/34d35f8e4e8613916b3c6cb7f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论