项目结构:
./src/com/example/Test.java
./src/com/example/Dog.java
Test.java
package com.example;
public class Test {
public void testing() {
Dog d = new Dog("Lab");
}
}
Dog.java
package com.example;
public class Dog {
private String breed;
Dog(String breed) {
this.breed = breed;
}
}
我尝试这个时成功编译
.\src > javac com\example\Test.java
但是当我这样做时它失败了
.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar" com\example\Test.java
出现此错误
error: cannot find symbol
Dog d = new Dog("Lab");
^
symbol: class Dog
location: class Test
我猜这是因为现有的类路径被覆盖了。我该如何避免?
另外,你可以解释一下从\ src的父目录运行它失败的详细原因吗,这个
javac src\com\example\Test.java
我得到与classpath相同的错误。
抱歉所有的困惑。
感谢Jon Skeet提供帮助。
答案 0 :(得分:0)
另一种可能的解决方案:
javac -cp C:\Tomcat\lib\servlet-api.jar -sourcepath C:\Users\AK051428\Desktop\projects\listener_test\src -d classes src\com\example\TestServlet.java
现在告诉javac你的源树所在的位置。
答案 1 :(得分:0)
编译器会将类路径上的目录视为源根目录 - 换句话说,在尝试查找包com.example
的类时,它将查找类和源文件类路径上每个目录的com/example
子目录。
当你这样编译时:
.\src > javac com\example\Test.java
...类路径隐含地"当前目录"。
当您明确指定类路径时:
.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar" com\example\Test.java
......它不是。您需要明确地将.
添加到类路径中:
.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar";. com\example\Test.java
同样,当您 src
中没有时,您必须将src
指定为类路径:
. > javac -cp src src\com\example\Test.java
我个人尝试确保我想要编译的所有源代码都在javac
中明确列出 - 否则很可能使用过时的类文件而不是重新编译源代码代码。
答案 2 :(得分:-1)
.\listener_test > javac -cp .;C:\Tomcat\lib\servlet-api.jar;"C:\Users\AK051428\Desktop\projects\listener_test\src" -d classes src\com\example\TestServlet.java
添加“。;”