0

在一个 tomcat JSP 应用程序中,我有这个目录布局:

webapps/
    myProjectName/
        index.jsp
        WEB-INF/
            classes/
                mypackage/
                    class1.java
                    class2.java

我正在尝试编译引用class2.java 的class1.java。它以如下形式编码:

package mypackage;

public class class1 extends class2 {}

和 class2 看起来像这样:

package mypackage;

public class class2 {}

但是,我在 class1 上收到一个错误,说找不到 class2。首先我编译了class2,它编译得很好,但是当我尝试编译class1时它失败了,说找不到class2。我尝试通过将其添加到 /etc/enviornment 来将目录添加到我的类路径(ubuntu):

/usr/local/tomcat/webapps/myProjectName/WEB-INF/classes

但它仍然无法编译。

知道有什么问题吗?

确切的错误输出是这样的:

javac "Page.java" (in directory: /usr/local/tomcat/webapps/developers/WEB-INF/classes/library)
Page.java:20: cannot find symbol
symbol  : class DynamicPage
location: class library.Page
        DynamicPage dynamicClasses = {new registerPage()};
        ^
Page.java:20: illegal initializer for <none>
        DynamicPage dynamicClasses = {new registerPage()};
                                     ^
Page.java:20: cannot find symbol
symbol  : class registerPage
location: class library.Page
        DynamicPage dynamicClasses = {new registerPage()};
                                      ^
Page.java:34: cannot find symbol
symbol  : class DynamicPage
location: class library.Page
            DynamicPage selected = null;
            ^
Page.java:35: cannot find symbol
symbol  : class DynamicPage
location: class library.Page
            for (DynamicPage dp: dynamicClasses) {
                 ^
5 errors
Compilation failed.
4

4 回答 4

1

我不明白为什么有些人如此反对使用 Eclipse 或 Netbeans(或任何 IDE)。我意识到有些人更喜欢手动驾驶而不是自动驾驶,因为您往往会感受到发动机的原始动力。我学会了使用自动驾驶,然后习惯了手动驾驶。我现在是熟练的手动驾驶员,通过学习自动驾驶。我现在什至可以相当熟练地操作挖掘机(我为我正在建造的房子挖了洞)。

与 Java 相同。您让 Netbeans 或 Eclipse 为您构建整个 Web 应用程序结构,然后检查该结构。玩弄 ant build。通过使用它来学习 IDE。

我知道有些人认为,如果没有 IDE,您会将自己暴露在原始编译过程中,因此会对构建过程有“更深入”的了解。真的吗?不要浪费你的时间。让 IDE 为您完成。如果您愿意检查 IDE 生成的文件和结构,您将更快地了解构建过程。

于 2011-01-02T04:41:32.680 回答
0

除了无法识别课程之外,还有其他一些错误,但是当涉及到您的问题时:

  • 不要在类路径中添加任何东西,这是无关紧要的,
  • 不要更改任何系统设置,它们无关紧要,
  • 暂时不要担心包装 - 您仍在学习基础知识,
  • 不要使用 Zeki 的 javac 行,它不起作用(*.java 只会编译 classes/ 目录中的文件,而你想编译 mypackage 下的类)。

最重要的是:不要认为这很难或需要复杂的设置。这真的很容易,而且一旦你开始学习 Java 就做好是非常重要的。

当 javac 编译一个类并发现它使用了某个其他类时,它会在两个位置查找它,称为类路径(用于编译版本)和源路径(用于源代码)。默认情况下,它们都包含当前工作目录。请注意,它与包含 .java 文件的目录不同。

类路径中 .java 或 .class 文件的确切位置始终取决于包(但您已经知道了)。在您的情况下,如果您这样做:

cd WEB-INF/classes/mypackage
javac class1.java

您的源路径是 WEB-INF/classes/mypackage,所需的类是 mypackage.class2,因此,与直觉相反,javac 将查找文件 WEB-INF/classes/mypackage/mypackage/class2.java。此类文件不存在,您会收到错误消息。

另一方面,想象一下:

cd WEB-INF/classes
javac mypackage/class1.java

现在您的源路径是 WEB-INF/classes,所需的类是 mypackage.class2,javac 将查找文件 WEB-INF/classes/mypackage/class2.java - 它会毫无问题地找到它。

寓意:编译时,始终在源代码的顶层目录中写入 javac,尤其是所有包。通过这种方式,您的包与 javac 所见的目录对齐,并且编译完美无缺。

在您设法准确理解发生的一切之后,无论如何 - 切换到 Netbeans(并且,在并行线程中,学习 ant,然后是 maven)。它安装了它自己的 tomcat 6 副本,您可以使用它来开发您的应用程序;tomcat 7 是向下兼容的,所以安装你的应用程序只需将 war 文件(由 netbeans 构建)复制到你的 tomcat 7 webapps。

于 2011-01-02T12:31:25.510 回答
0

在你的类文件夹中运行它:

javac -cp /usr/local/tomcat/webapps/myProjectName/WEB-INF/classes *.java

您需要在编译期间包含类路径。

于 2011-01-02T04:08:26.177 回答
0

WEB-INF 下的任何地方都不应该有 .java 源文件。保持编译和打包分开。

于 2011-01-02T04:10:41.297 回答