Java编译报package not found错误该如何正确配置classpath
问题原因
Java类查找的核心逻辑是:classpath指定的是包结构的根目录,不是某个包本身的文件夹。代码里写import pkg.*引用pkg包下的类时,编译器会在你配置的每一个classpath路径下,拼接/pkg/类名.class去查找对应文件。
你之前用javac -cp "./pkg" B.java编译,相当于把类搜索根设成了./pkg文件夹,编译器找pkg.A的时候实际会去找./pkg/pkg/A.class,但你的A.class实际存放在./pkg/A.class,路径匹配不上,自然报找不到包的错误。
另外你存放B.java的位置也不符合规范:B类声明了package mypkg;,源文件需要放在对应包名的mypkg目录下,否则就算classpath配对了,编译也会因为包声明和文件路径不匹配出问题。
正确配置&操作步骤
所有操作都在testjava文件夹下执行,按顺序来:
- 先调整源文件存放结构
- 把声明为
package pkg的A.java放到testjava/pkg/路径下 - 新建
testjava/mypkg/文件夹,把声明为package mypkg的B.java放到这个路径下
- 把声明为
- 编译A.java,执行命令:
执行完成后会在当前目录生成javac -d . pkg/A.javapkg/A.class,和你之前的编译结果一致。 - 编译B.java,classpath配置为当前目录
.即可,不要指向pkg文件夹,命令如下:
编译成功后会自动生成javac -cp "." -d . mypkg/B.javamypkg/B.class文件。 - 后续运行程序时,classpath同样配置为包结构的根目录就行,执行命令:
正常运行会输出java -cp "." mypkg.BI'm in A。
补充说明
- 不管编译还是运行带package声明的类,classpath永远填包层级最上层的根目录,不要填具体某一层包的文件夹路径。
- 编译时建议始终加
-d .参数,编译器会自动按照包名生成对应的目录结构存放class文件,不用手动创建目录,能减少很多路径错误。 - 如果需要引入多个路径下的类,Windows系统用分号
;分隔不同classpath路径,Linux/macOS系统用冒号:分隔。
内容的提问来源于stack exchange,提问作者manusrao
相关产品推荐
相关产品推荐

