命令行执行javac编译提示cannot find symbol错误如何解决
问题根因
你当前的项目根目录结构如下:
├── appointment └── src └── main └── java └── com └── sendemail ├── MainAppointment.java └── SendMail.java
两个命令行编译报错都是没有遵循Java基于包结构的编译运行规则导致的:
- 在sendemail包外目录执行
javac MainAppointment.java提示找不到文件:当前工作路径下不存在MainAppointment.java文件,路径引用错误 - 进入sendemail目录执行命令报
cannot find symbol错误:Java编译带package声明的类时,必须以包根目录作为工作目录执行命令,在包内子目录执行编译时,编译器无法识别同包类的路径映射,就会找不到关联的SendMail类。
IDEA内部已经自动帮你处理了源码根目录的路径映射,所以可以正常编译运行。
解决步骤
首先确认两个Java文件头部都有正确的包声明package com.sendemail;(IDEA能正常运行说明这部分配置是对的),然后按以下步骤操作:
- 命令行切到Java源码根目录,也就是你项目结构里的
src/main/java路径:
cd 你的项目本地存储绝对路径/src/main/java
- 执行编译命令,传入Java文件的完整相对路径。如果要把编译生成的class文件统一输出到根目录的appointment文件夹,可以加
-d参数指定输出目录:
# 直接编译,class文件生成在对应java文件同目录 javac com/sendemail/MainAppointment.java com/sendemail/SendMail.java # 推荐:指定class输出到项目根目录的appointment文件夹,避免源码目录混入class文件 javac -d ../../appointment com/sendemail/*.java
- 运行程序时,同样要在包结构的根目录执行命令(如果用了
-d参数指定输出到appointment目录,就先切到appointment目录),传入全限定类名(包名+类名):
# 编译时未指定输出目录,在src/main/java路径下执行 java com.sendemail.MainAppointment # 编译时指定输出到appointment目录,先切到appointment路径再执行上述java命令
注意事项
只要类声明了package,不要进入com/sendemail这类包内子目录执行javac或java命令,所有编译、运行操作都要在包层级的最外层根目录操作:编译时传入文件的相对路径,运行时传入全限定类名。
内容的提问来源于stack exchange,提问作者yigal92
相关产品推荐
相关产品推荐

