【问题标题】:Compile Servlets and others classes in a Java Web project在 Java Web 项目中编译 Servlet 和其他类
【发布时间】:2017-03-15 06:46:32
【问题描述】:

我是 Java 新手,我正在尝试仅使用命令行在 linux 上编译我的 Servlet。在浏览器上看到此错误后,我决定这样做: 命令javac -classpath /opt/tomcat/lib/servlet-api.jar ComputerSV.java 给出以下错误:

ComputerSV.java:13: error: cannot find symbol
        ArrayList<Computer> computers = new ArrayList<>();
                  ^
  symbol:   class Computer
  location: class ComputerSV
ComputerSV.java:15: error: cannot find symbol
            new Computer(
                ^
  symbol:   class Computer
  location: class ComputerSV
ComputerSV.java:25: error: cannot find symbol
            new Computer(
                ^
  symbol:   class Computer
  location: class ComputerSV
3 errors

而我的 Servlet 源代码是:

package com.lcdss.compmng.controller;

import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;[Imgur](http://i.imgur.com/D6rN3UA.png)
import javax.servlet.http.HttpServletResponse;

class ComputerSV extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        ArrayList<Computer> computers = new ArrayList<>();
        computers.add(
            new Computer(
                1,
                "HP",
                "hostname",
                "Windows 10 Pro x64",
                "Intel I7 7700K 4.2 GHz",
                2048,
                8196,
                "Anapolis"
            ),
            new Computer(
                2,
                "DELL",
                "hostname",
                "Windows 10 Home Basic x64",
                "Intel I7 7500U 2.5 GHz",
                512,
                4098,
                "Goiania"
            )
        );

        request.setAttribute("computers", computers);
        request.getRequestDispatcher("computer/index.jsp").forward(request, response);
    }
}

我使用 tomcat 作为 Web 服务器,并且只是一个文本编辑器 (Atom) 来帮助我完成这个挑战(以及现在的 stackoverflow)。我现在的问题是编译器没有找到我已经编译的类计算机,但没有成功修复此错误。

【问题讨论】:

  • 一次编译所有类。或者使用真正的构建,比如 gradle。
  • 你为什么不使用像eclipse或IntelliJ这样的IDE?
  • 因为在使用 IDE 或其他工具使事情变得简单之前,我想知道事情是如何工作的。下一步将使用我喜欢的 Jetbrains 的 IntelliJ,但现在,只需使用我的“裸手”。

标签: java tomcat servlets tomcat8


【解决方案1】:

与tomcat无关,是正常的编译问题。 在编译时间/阶段,当 ArrayList&lt;Computer&gt; computers = new ArrayList&lt;&gt;(); 被编译时,jvm 将寻找 class Computer 因为你已经指定你的 arraylist 将只包含这个类型。但是由于这里没有 Computer 类时间点,它会抛出一个异常,ClassNotFoundException。要成功运行这个,最好先创建一个类Computer,编译它,然后编译这个类。

【讨论】:

  • 我写的最后一件事就是这么说的,所以我的问题是如何告诉编译器我的 Computer.class 在哪里。
  • 将两个类放在完全相同的包/路径中,像这样....如果你的主类在 G:/myFolder/MyMainClass 中,并且将你的计算机类也放在 G:/myFolder/ 中计算机类。
  • javac对包的定义很敏感,所以我必须把我的依赖类放在同一个位置,更改包名并编译主类。这对我来说不是一个可行的解决方案。
【解决方案2】:

我错过了对 Computer 类的导入,并且在上面的示例中出现了语法错误。

package com.lcdss.compmng.controller;

import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lcdss.compmng.entity.Computer;

public class ComputerSV extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        ArrayList<Computer> computers = new ArrayList<>();

        computers.add(
            new Computer(
                1,
                "HP",
                "hostname",
                "Windows 10 Pro x64",
                "Intel I7 7700K 4.2 GHz",
                2048,
                8196,
                "Anapolis"
            )
        );

        computers.add(
            new Computer(
                2,
                "DELL",
                "hostname",
                "Windows 10 Home Basic x64",
                "Intel I7 7500U 2.5 GHz",
                512,
                4098,
                "Goiania"
            )
        );

        request.setAttribute("computers", computers);
        request.getRequestDispatcher("computer/index.jsp").forward(request, response);
    }
}

为了编译,我使用了命令javac -cp /opt/tomcat/webapps/compmng/WEB-INF/classes:/opt/tomcat/lib/servlet-api.jar ComputerSV.java。第一个类路径 (cp) 通知编译器我的类在哪里以及包名是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多