命令行出现 javac "cannot find symbol" 错误

13

我有两个类Owning和OwningAccessor,它们的文件在同一个目录中。

public class Owning {
    String _name = "";
    public void printBanner()
    {
    }
    public void printOwning(double amount)
    {
        printBanner();

        //print details
        System.out.println("name:" + _name);
        System.out.println("amount:" + amount);
    }
}


public class OwningAccessor {
    public void access()
    {
        Owning o = new Owning();
        o.printOwning(500);
    }
}

当我尝试使用 javac -cp . OwningAccessor.java 编译 OwningAccessor 时,遇到了编译错误。

symbol  : class Owning
location: class smcho.OwningAccessor
        Owning o = new Owning();
        ^
OwningAccessor.java:6: cannot find symbol
symbol  : class Owning
location: class smcho.OwningAccessor
        Owning o = new Owning();
                   ^

这里有什么问题吗?在Eclipse IDE下编译代码没有问题。


4
他们在同一个目录里吗?请展示你的源路径目录结构。 - Ruan Mendes
它们在同一个目录中。 - prosseek
没有复现,这里可以工作。如果您首先编译Owning.java,它是否有效? - Daniel Fischer
你不需要在那里加一个 this 吗? - Burhan Khalid
@Daniel:没有 -cp . 仍然出现相同的错误。 - prosseek
显示剩余2条评论
4个回答

19

好的,假设你将代码按照以下方式分散在文件中

myproject
├── out
└── src
    ├── OwningAccessor.java
    └── Owning.java

打开命令提示符,切换到myproject目录。然后输入以下命令:

javac -d out -sourcepath src src/OwningAccessor.java

我刚刚测试了一下,它可以正常工作。你编译好的类将位于out文件夹中:

.
├── out
│   ├── OwningAccessor.class
│   └── Owning.class
└── src
    ├── OwningAccessor.java
    └── Owning.java

编译一个类将触发所有其他依赖类的编译。编译器会自动在src文件夹中查找它们。


这只是编译程序,我想知道为什么在CMD中没有得到system.out.print的输出? - Faizan
最好的方法是创建一个jar文件,它会处理所有这些问题,并且非常简单。 - ramu

14

请确保编译Owning.java和OwningAccessor.java这两个文件,命令如下:

javac -cp . Owning.java OwningAccessor.java

Eclipse可以为您编译所有必要的文件,所以在Eclipse中可以工作。


Java会自动解决依赖关系吗? - Ruan Mendes
2
如果你在编译器中使用-sourcepath标志,它就会这样做。 - Edwin Dalorzo
Sourcepath应该可以解决问题,但不幸的是我无法测试它,因为我的机器上的javac在尝试编译任何东西时都会崩溃并出现ACCESS_VIOLATION错误。 - Kninnug
@Kninnug: -sourcepath不起作用。我不明白为什么一次性编译所有源文件可以工作,而逐个编译却不行。 - prosseek
好的,就像我说的一样,我现在无法测试它(除了Eclipse,这不是我们想要的)。但显然javac不能自己查找必要的文件。您还可以输入javac -cp . *.java,这应该编译该目录中的所有.java文件。 - Kninnug

1
尝试制作正确的源路径示例:
javac -d temp -sourcepath c:\awork\JavaProjects\singleton\src\ c:\JavaProjects\singleton\src\com\company\MySingleton.java
javac -d temp -sourcepath c:\awork\JavaProjects\singleton\src\ c:\JavaProjects\singleton\src\com\company\Main.java
在“temp”中,我们分配资源,并使用-sourcepath指示.java文件的位置。

0
在名为D:\Automation的目录中,有一个文件Demo.java抛出了错误,在cmd中当你在D:\Automation时,你需要执行以下操作: 1)cd.. //将使您退出Automation目录。 在D:> 2)javac Automation\Demo.java
这将编译您的文件-Demo.java。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接