手动创建包的问题

问题描述 投票:0回答:1

问题背景:

我有一个手动创建的java“项目”,独立于任何具有如下目录结构的IDE:

project directory

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 package
1个回答
0
投票

您似乎不理解类路径的想法。这基本上是您两个问题的答案。

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

应该有一个公共构造函数,以便其他包中的类可以调用它。

© www.soinside.com 2019 - 2024. All rights reserved.