我对SCJP书中的以下问题不太清楚(尽管我阅读了解决方案和解释)..
考虑以下目录结构: -
foo --> test --> xcom --> A.class, B.java
这里foo,test和xcom是目录。 A.class和B.java是xcom目录中的文件。
以下是相应文件的源代码: -
A.java
package xcom;
public class A { }
B.java
package xcom;
public class B extends A { }
默认的类路径是/ foo。
现在,为了编译B.java,我将当前目录作为测试并给出: -
javac -classpath xcom xcom/B.java
这里我将类路径作为xcom提供,其中包含A.class。但它仍然没有找到A类。为什么会这样?
答案 0 :(得分:2)
如果您的类在xcom包中,那么您的类路径需要位于该路径的正上方。在这种情况下,类路径应该是foo / test。
如果您当前的目录是 foo / test ,那么这应该是您的javac:
javac -classpath . xcom/B.java
答案 1 :(得分:0)
因为必须将classpath root指定为-classpath
参数,例如javac -classpath . xcom/B.java
。要编译B类,java编译器需要A类,它会尝试在{classpathroot}/xcom/
中找到A类文件。
注意:.
- 是当前目录
答案 2 :(得分:0)
我认为这里的根本原因是对Java中“完全限定名称”的误解。
两个类的完全限定名称是xcom.A和xcom.B.它们的源代码位于名为xcom的目录中的文件A.java和B.java中;完全限定名称决定了目录结构。当您要使用这些文件时,无论是编译它们还是运行它们,类路径都包含一个或多个可以找到完全限定名称的位置;所以java正在寻找xcom \ A.java和xcom \ B.java(编译时)和xcom \ A.class和xcom \ B.class(运行时)。
这就是为什么classpath需要指定包含xcom的目录。
当你进入更复杂的环境时:类路径可以是这些位置的列表;每个位置由Windows上的分号和unix系统上的冒号分隔。每个位置都可以是一个目录,如您所见,但它也可以是一个jar文件。 jar文件是zip文件格式,zip文件的目录结构就像磁盘一样。因此,您可以压缩类文件,维护其xcom父级(但不是它们的完整路径),并在类路径而不是目录中指定jar文件。
我知道这个问题已经有所回答,但您也可以考虑背景说明。