问题背景:
我有一个手动创建的java“项目”,独立于任何具有如下目录结构的IDE:
number\里面有一个文件叫IntegerFour.java 在 tester\ 里面有一个名为 EncryptTest.java 的文件
我已经使用 package 语句将一个包分配给 IntegerFour.java 文件:
package number;
我已经使用 package 语句将一个包分配给 EncryptTest.java 文件:
package tester;
现在在 EncryptTest.java 中,我使用以下语句导入了 IntegerFour 类:
import number.IntegerFour;
IntegerFour.java:
package number;
public class IntegerFour
{
IntegerFour(){}
}
加密测试.java
package tester;
import number.IntegerFour;
public class EncryptTest
{
public static void main(String args[])
{
IntegerFour userNum = new IntegerFour();
}
}
终端:
PS C:\Users\hunkh> cd C:\Users\hunkh\OneDrive\Desktop\project
PS C:\Users\hunkh\OneDrive\Desktop\project> javac .\source\number\IntegerFour.java
PS C:\Users\hunkh\OneDrive\Desktop\project> javac .\source\tester\EncryptTest.java
.\source\tester\EncryptTest.java:2: error: package number does not exist
import number.IntegerFour;
^
.\source\tester\EncryptTest.java:9: error: cannot find symbol
IntegerFour userNum = new IntegerFour();
^
symbol: class IntegerFour
location: class EncryptTest
.\source\tester\EncryptTest.java:9: error: cannot find symbol
IntegerFour userNum = new IntegerFour();
^
symbol: class IntegerFour
location: class EncryptTest
3 errors
PS C:\Users\hunkh\OneDrive\Desktop\project>
问题:
现在,当我编译 IntegerFour.java 文件时,它可以正常编译。 当我编译 EncryptTest.java 文件时,它给出以下语句的错误: “包裹‘编号’不存在。”
我尝试过的
我已经阅读了包的官方 Oracle 文档,并阅读了许多堆栈溢出文章,但找不到一个可以帮助我完全理解包如何工作的综合指南。
与此相反,当我使用像 IntelliJ 这样的 IDE 创建项目并使用 IntelliJ 本身创建包并向其中添加文件时,一切正常,即使代码和目录结构完全相同。
问题是我想与其他人共享我的包,所以我想手动执行此操作,而不使用 IDE,以便首先了解一切是如何工作的。
此外,classes/ 文件夹用于托管相应的 .class 文件(如果它们被编译过那就哈哈)。
我还有围绕该主题的其他问题,例如:
Q1:如果包名应该镜像父目录路径,为什么我们不从根文件夹开始,例如C.Users...
Q2:如果我成功创建了一个包,我可以在系统上任何位置的任何 java 文件中使用它吗?套餐的范围如何运作。
您似乎不理解类路径的想法。这基本上是您两个问题的答案。
Java从哪里开始寻找类,是由类路径决定的。默认情况下,这是您运行命令的位置,因此在您的情况下,类路径是“project”。要解析number.IntegerFour
,
javac
会查找“project/number/IntegerFour.class”。没有这样的“project/number”目录,因此编译失败。此处使用的正确类路径是“project/source”,因为“number/IntegerFour.class”位于此处。您可以添加
-cp source
选项,或者直接在“source”中运行命令。这也适用于使用
java
运行类文件时。确保类路径正确!由于您还有一个“classes”目录,IMO 最好使用
-d classes
在那里生成 .class 文件,那么类路径将是“project/classes”。与其将每个文件逐一编译,不如将所有文件传给
javac
会更方便。只需列出所有要编译的文件并将它们传递给
javac
,或使用
-sourcepath
选项即可。最后,
IntegerFour
应该有一个公共构造函数,以便其他包中的类可以调用它。