首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >包名称与文件夹结构不同,但Java代码仍可编译

包名称与文件夹结构不同,但Java代码仍可编译
EN

Stack Overflow用户
提问于 2011-12-06 13:52:01
回答 4查看 17.5K关注 0票数 32

我正在使用Notepad++编写我的Java代码,并使用命令提示符来编译和运行它。以下是我的样例Java代码,

代码语言:javascript
代码运行次数:0
运行
复制
    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并完成它。它是如何检查带有包名的文件夹结构的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-07 15:17:31

经过一些试验,我掌握了如何使用包名和从命令提示符运行Java类文件的方法。

假设下面是我的Java源文件:

代码语言:javascript
代码运行次数:0
运行
复制
    package mySample;


    public abstract class Sample{
        public static void main(String... a){
           System.out.println("Hello ambiguity");
        }
    }

此文件位于目录"D:\Code N Code\CommandLine“中。

现在,当使用以下命令编译源代码时(从cmd转到上面的目录):

代码语言:javascript
代码运行次数:0
运行
复制
    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“中。为了运行我的类文件,我给出了以下命令:

代码语言:javascript
代码运行次数:0
运行
复制
    java mySample.Sample

因此,我给出了包的完整层次结构,然后是类名。Java解释器将在当前目录中搜索"mySample“目录,并在该目录中搜索"Sample.class”。它得到了正确的结果并成功地运行了。:)

现在,当我问它为什么会编译错误的包源代码时,它会成功地编译代码,但当我运行类文件时,它会给出NoClassDefFoundError。所以上面的方法可以用来从命令行使用包名。

票数 10
EN

Stack Overflow用户

发布于 2011-12-06 13:55:09

Java语言规范并不强制将文件放在某个目录中。它允许编译器要求公共类与类名相同的文件中,但我不认为有任何类似的包。Section 7.2.1谈到了文件系统中可能的存储选项,但据我所知,它没有提到任何关于强制源代码结构的内容。

但是,在源目录结构中反映包结构是最佳实践,也是一个几乎被普遍接受的约定……javac将使用它来尝试查找未显式指定要编译的源文件。

请注意,如果您从命令行编译,默认情况下,每个类将出现在与相应源文件相同的位置,但如果您使用"-d“选项(例如,"-d bin"),编译器将为您构建一个适当的输出目录结构,其根位于指定的目录中。

票数 53
EN

Stack Overflow用户

发布于 2011-12-06 13:58:13

如果您正在编译单个类,javac不需要在其他地方寻找它。它只是按原样编译文件,并将生成的.class放入相同的文件夹中。但是,在将类放入类路径中某个目录的"abraKadabra“目录之前,通常无法使用它。

但是,如果您的类使用包中的另一个类,则出于相同的原因(javac希望找到该类并确保它具有您的类使用的方法等),您可能会在原地编译它时遇到问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8395916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档