不明白javac使用-classpath之后

时间:2012-01-16 12:51:08

标签: java classpath javac

我对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类。为什么会这样?

3 个答案:

答案 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文件。

我知道这个问题已经有所回答,但您也可以考虑背景说明。