Problem Context:

我有一个手工创建的java"项目",它独立于任何IDE,其目录 struct 如下:

project directory

Inside Number\有一个名为IntegerFour.java的文件 在Tester中,有一个名为EncryptTest.java的文件

我已经使用Package语句将一个包分配给了IntegerFour.Java文件: package number;

我已将一个包分配给www.example.com文件,并使用包语句: package tester;

现在,在EncryptTest.java中,我已经使用以下语句导入了IntegerFour类: import number.IntegerFour;

IntegerFour.java:

package number;

public class IntegerFour
{
    IntegerFour(){}

}

EncryptTest.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>

Problem:

现在,当我编译IntegerFour.java文件时,它可以正常编译. 当我编译EncryptTest.Java文件时,它给出以下语句错误: "程序包‘编号’不存在."

What I have tried

我已经阅读了Oracle官方的包文档,并阅读了许多堆栈溢出文章,但没有找到一个全面的指南来帮助我完全理解包是如何工作的.

与此相反,当我使用像IntelliJ这样的IDE创建一个项目,并使用IntelliJ本身创建一个包并向其中添加文件时,一切都正常工作,即使代码和目录 struct 完全相同.

问题是我想和其他人共享我的软件包,所以我想在不使用IDE的情况下手动完成这一操作,以便首先了解一切的工作原理.

此外,classes/文件夹是托管相应的. class文件(如果他们曾经被编译,那是哈哈).

我也有其他关于这个主题的问题,如:

Q1:如果包名应该是父目录路径的镜像,为什么我们不从根文件夹开始,例如C.用户...

Q2:如果我成功创建了一个软件包,我可以在任何Java文件中使用它吗?包的范围是如何工作的.

推荐答案

你似乎不理解class paths的概念.这基本上就是你两个问题的答案.

Where 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应该有一个公共构造函数,以便其他包的类可以调用它.

Java相关问答推荐

收听RDX中用户数据的变化

gitlab ci不会运行我的脚本,因为它需要数据库连接'

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

ittext pdf延迟签名,签名无效

springboot start loge change

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

Java编译器抛出可能未正确初始化的错误?

自定义批注的外推属性值

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

如何在透视表中添加对计数列的筛选?

FETCH类型设置为LAZY,但它仍会发送第二个请求

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

泛型与泛型问题的完美解决方案?

如何调整JButton的大小以适应图标?

持续时间--为什么在秒为负数的情况下还要做额外的工作?

如何使用Java对随机生成的字母数字优惠券代码进行过期设置

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

在数组中查找素数时出现逻辑错误

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

Jackson YAML:支持锚点扩展/覆盖