我正在使用Notepad++编写我的Java代码,并使用命令提示符来编译和运行它。以下是我的样例Java代码,
package abraKadabra;
public class SuperClass{
protected int anInstance;
public static void main(String [] abc){
System.out.println("Hello");
}
}
但是,此文件位于以下文件夹结构中:
"usingprotected\superPkg“(usingProtected是C:中层次结构中的某个文件夹)
因此,我在这里的包名应该类似于usingProtected.superPkg,而不是我编写时的abraKadabra。
但是,当我从命令提示符编译这段Java代码时,它编译得很好,没有出现错误或警告。为甚麽呢?包名不应该与文件夹结构保持一致吗?如果它应该,它将如何坚持?
例如,如果我的包名是usingProtected.superPkg,编译器是否会以相反的顺序进行检查。当前的工作目录应该是superPkg,那么父目录应该是usingProtected并完成它。它是如何检查带有包名的文件夹结构的?
发布于 2011-12-07 07:17:31
经过一些试验,我掌握了如何使用包名和从命令提示符运行Java类文件的方法。
假设下面是我的Java源文件:
package mySample;
public abstract class Sample{
public static void main(String... a){
System.out.println("Hello ambiguity");
}
}
此文件位于目录"D:\Code N Code\CommandLine“中。
现在,当使用以下命令编译源代码时(从cmd转到上面的目录):
javac -d . Sample.java
这会自动在我的当前目录中创建"mySample“文件夹。因此,我的类文件Sample.class位于目录"D:\Code N Code\CommandLine\mySample“中。编译器根据我在源代码中给出的包名创建了这个新文件夹"mySample“。
因此,如果我将包名指定为"package com.mySample",编译器将创建两个目录,并将我的类文件放在"D:\Code N Code\CommandLine\com\mySample“中。
现在,我仍然在当前的工作目录中,即"D:\Code N Code\CommandLine“中。为了运行我的类文件,我给出了以下命令:
java mySample.Sample
因此,我给出了包的完整层次结构,然后是类名。Java解释器将在当前目录中搜索"mySample“目录,并在该目录中搜索"Sample.class”。它得到了正确的结果并成功地运行了。:)
现在,当我问它为什么会编译错误的包源代码时,它会成功地编译代码,但当我运行类文件时,它会给出NoClassDefFoundError。所以上面的方法可以用来从命令行使用包名。
发布于 2011-12-06 05:55:09
Java语言规范并不强制将文件放在某个目录中。它允许编译器要求公共类与类名相同的文件中,但我不认为有任何类似的包。Section 7.2.1谈到了文件系统中可能的存储选项,但据我所知,它没有提到任何关于强制源代码结构的内容。
但是,在源目录结构中反映包结构是最佳实践,也是一个几乎被普遍接受的约定……javac将使用它来尝试查找未显式指定要编译的源文件。
请注意,如果您从命令行编译,默认情况下,每个类将出现在与相应源文件相同的位置,但如果您使用"-d“选项(例如,"-d bin"),编译器将为您构建一个适当的输出目录结构,其根位于指定的目录中。
发布于 2011-12-06 05:58:13
如果您正在编译单个类,javac
不需要在其他地方寻找它。它只是按原样编译文件,并将生成的.class
放入相同的文件夹中。但是,在将类放入类路径中某个目录的"abraKadabra“目录之前,通常无法使用它。
但是,如果您的类使用包中的另一个类,则出于相同的原因(javac
希望找到该类并确保它具有您的类使用的方法等),您可能会在原地编译它时遇到问题。
https://stackoverflow.com/questions/8395916
复制相似问题