Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建Java源文件和/或声明/导入包以确保无错误编译的规则是什么?_Java_Package_Javac - Fatal编程技术网

构建Java源文件和/或声明/导入包以确保无错误编译的规则是什么?

构建Java源文件和/或声明/导入包以确保无错误编译的规则是什么?,java,package,javac,Java,Package,Javac,我有几个文件保存在一个包中,customQ。此包被导入名为QWithExceptions的测试客户端。源树的排列如下: /tryThis09_01/+ | -QWithExceptions.java | /customQ/+ | -circularQ.java

我有几个文件保存在一个包中,
customQ
。此包被导入名为
QWithExceptions
的测试客户端。源树的排列如下:

/tryThis09_01/+
              |
              -QWithExceptions.java
              |
              /customQ/+
                       |
                       -circularQ.java
                       -staticQ.java
                       -emptyQException.java
                       -fullQException.java
当I
cd
tryThis09\u 01/
并运行
$javac QWithExceptions.java
时,测试客户端编译没有错误

然而,当我决定做一点实验时,我发现我对包及其结构的直觉是完全错误的。实际的包
customQ
和测试客户端
QWithExceptions
更深入地隐藏在源代码树中,如下所示:

~/learningJava/beginnersGuide/chapter09/tryThis09_01/+
                                                     |
                                                     -QWithExceptions.java
                                                     |
                                                     /customQ/+
                                                              |
                                                              -circularQ.java
                                                              -staticQ.java
                                                              -emptyQException.java
                                                              -fullQException.java

开发环境中的linter建议我将
customQ/*.java
中的包声明从
packagecustomq
包初学者指南.chapter09.tryThis09\u 01.customQ。这样做之后,我更改了测试客户端中的import语句以反映新的包名,并将
QWithExceptions.java
移动到
~/learningJava/
并执行
$javacqwithexceptions.java
,这导致了一系列编译错误

我还尝试了
$javac-cp.:$CLASSPATH qwithexpetions.java
$javac-d-cp.:$CLASSPATH QWithExceptions.java
,以及将
QWithExceptions.java
在源代码树中一次向上和向下移动一个目录,所有这些都有各种错误

目前,我正在处理一个
坏的类文件
错误。虽然我知道编译器希望我将有问题的文件移动到文件树中的其他位置(或者修改包声明或导入语句),但我不确定如何在不调用
包不存在的情况下执行此操作


我肯定遗漏了一些包编写的基本规则,而这些规则(对我来说)在更广泛的web或Java文本中发现的琐碎实现中并不明显。如果您知道它是什么,请分享您的智慧。

我无法重现您的问题,因为您忘记显示错误消息和文件内容。但我可以告诉你它是如何工作的:

我的文件夹结构:

stefan@stefanpc:~/learningjava$ tree
.
├── beginnersGuide
│   └── chapter09
│       └── tryThis09_01
│           └── customQ
│               └── Test.java
└── Main.java

文件Test.java:

package beginnersGuide.chapter09.tryThis09_01.customQ;

public class Test
{
   public int i;
}
文件Main.java:

import beginnersGuide.chapter09.tryThis09_01.customQ.Test;

public class Main {
    
    Test test;

    public static void main(String[] args){
        System.out.println("Hello");
    }
}
汇编:

stefan@stefanpc:~/learningjava$ javac Main.java 
stefan@stefanpc:~/learningjava$ 
类和相关文件名应以大写字符开头。但我想这不是你的问题原因

甲骨文的建议:
Java需要一个与文件夹结构对齐的包声明。例如,如果在源文件顶部声明了一个
package a.b.c'
,则需要将该路径放入
a/b/c
文件夹结构中。请注意,在编译过程中,文件夹结构是相对于源根目录的。因此,如果您将代码放在一个“src”文件夹中,并尝试从该“src”的父级上下文中编译,您将得到错误,因为在编译器看来,文件夹结构类似于
src/a/b/c
。同样,如果您的编译上下文设置为文件夹“a”,则会出现错误,因为现在编译器认为该文件夹类似于
b/c


对于刚接触Java的人来说,这是一个常见的问题。它的目的是让东西容易找到,但可能会让人烦恼。

Whaaaaaaat the ffffffffffff。。。好吧,这很有效。在某种程度上,我一定是打错了,因为我可以发誓,你所建议的正是我第一次猜测的正确的文件配置。然后,如果你要求我对你的答案(已表明为已接受的答案)投赞成票,请将答案标记为“有用”,所以,在我获得15或更高的声誉之前,我不会允许我这么做。对不起,我本想把它标记为已被接受的-就像你所做的那样。它确实看起来不应该太复杂,但这里发生的一切都令人困惑。什么样的情况下,经验丰富的程序员会觉得编写包很烦人?一般来说,IDE会帮您处理。我对它的烦恼不在于创建包,而在于当我导入一个项目时IDE似乎总是把源代码根弄错。