1

我是 java 和包的新手,需要一些帮助来导航它们。目前,我有一个用于 Web 应用程序的正常运行的 java 程序,其中我的所有 .java 和 .class 文件都位于myapp/WEB-INF/classeslinux 服务器上的目录中:

myapp/WEB-INF/classes/MyJavaClass1.class
myapp/WEB-INF/classes/MyJavaClass2.class
myapp/WEB-INF/classes/MyJavaClass3.class

这些文件都没有包含一行代码,package所以我假设正在使用系统默认包。

然后我添加了一个mytools目录,并在其中创建了一个新类。

myapp/WEB-INF/classes/mytools/MyToolClass1.class

但似乎这个新类无法访问myapp/WEB-INF/classes目录中的类,除非这些 java 文件包含包名。所以我的问题是如何将文件从系统默认包(例如未指定包)更改为命名包?

我应该追加package mypackage;到 MyJavaClass1.java、MyJavaClass2.java 和 MyJavaClass3.java 的第一行,然后追加package mypackage.mytools;到 MyToolClass1.java?

或者,在执行上述操作之前,我是否还需要创建一个目录并将 MyJavaClass1.class 等文件放在其中mypackagemyapp/WEB-INF/classes/mypackage

那么当我编译 .java 文件时,我是在它们自己的目录中编译每个文件(还是所有文件都需要从顶级目录编译)?

更新 1

如果我只是保留 java 文件的默认包(即没有包)myapp/WEB-INF/classes,并附加:

package mytools;
import MyJavaClass1;

到 MyToolClass1.java 并尝试从mytools目录编译 MyToolClass1.java,我得到以下编译错误:

MyToolClass1.java:21: '.' expected
import MyJavaClass1;
                   ^
MyToolClass1.java:21: ';' expected
import MyJavaClass1;
                    ^
2 errors
4

1 回答 1

2

如您所述,在java中,包定义在类的顶部。您的代码之所以有效,只是因为所有代码都在根目录下,即没有包。我建议您将所有类移动到一个包中...将它们全部移动到 mytools 目录中并添加package mytools;到每个目录中。

有关包最佳实践的快速参考,请通读此包教程。您可能希望通过相关函数打包您的类,这意味着有些可能会进入 mytools 目录,而有些可能会进入 mytools/parse ( package mytools.parse;)

于 2012-06-17T16:54:29.103 回答