Java error: cannot find symbol, but everything is in the same package

Java error: cannot find symbol, but everything is in the same package

我在命令行中遇到 运行 java class 问题。 它在 IntelliJ IDE 中运行得非常好,但是当我尝试编译我的模拟器 class 时,它会抛出一个错误

Simulator.java:4: error: cannot find symbol
    private final StackCreator<String> myStack;
                  ^
  symbol:   class StackCreator
  location: class Simulator
Simulator.java:7: error: cannot find symbol
        myStack = new StackCreator<>();
                      ^
  symbol:   class StackCreator
  location: class Simulator
2 errors
error: compilation failed

StackCreator 和 Simulator 都有“package JavaClasses;”在文件的开头。 我试过先编译 StackCreator 并且它可以工作,但没有为 Simulator 改变任何东西,仍然产生同样的错误。

javac 不会扫描整个磁盘,您需要告诉它一切。从来没有人*真正调用过 javac,这是有原因的。他们 运行 mvngradle,或者已经设置了一个 CI 工具来这样做,或者让他们的 IDE 这样做。

如果您出于某些奇怪的原因必须使用 javac(帮自己一个忙,学习 Maven 的第一步,这真的不是很困难,并且可以避免这种混乱),您需要告诉它在哪里查找。有多种方法可以这样做:

假设您有这些文件:

/Users/zekrofire/projects/MyApp/src/StackCreator/MyApp.java
/Users/zekrofire/projects/MyApp/src/StackCreator/util/MyFastList.java
/Users/zekrofire/projects/MyApp/src/otherpkg/Something.java

并且您希望 class 文件位于 /Users/zekrofire/projects/MyApp/bin.

最简单的方法:一次编译所有东西

忘记 src 目录并混合你的 java 和 class 文件(如果你觉得这很难看,请参阅关于使用 maven 的评论)。那么,就...

javac *.java

这将解决您的问题。告诉 javac 每个源文件。不幸的是,你不能 java 为每个 java 文件递归地搜索整个目录,你必须这样做:

cd /Users/zekrofire/projects/MyApp
cd src
mv -r * ..
cd ..
rmdir src
javac StackCreator/*.java otherPkg/*.java StackCreator/util/*.java

使用-class路径

cd /Users/zekrofire/projects/MyApp
javac -cp bin -d bin src/StackCreator/*.java

现在您可以一次编译一个文件。

使用-sourcepath

这并不像听起来那么酷,不要认为这会让您跳过使用实际构建系统。

cd /Users/zekrofire/projects/MyApp
javac -sourcepath src -d bin src/StackCreator/*.java

绝对的,最好的方法

apt install maven
; create a pom.xml file describing your deps
; move your source files to src/main/java as per
; maven standard
mvn compile

*) 我四舍五入了。