2017-03-15 23 views
0

我是Java新手,我试图仅使用命令行在Linux上编译我的Servlet。我决定做,看到这个错误在我的浏览器后: https://i.imgur.com/D6rN3UA.png 命令javac -classpath /opt/tomcat/lib/servlet-api.jar ComputerSV.java提供了以下错误:在Java Web项目中编译Servlet和其他类

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)。我现在的问题是,编译器没有找到我已经编译好的类,但没有成功解决这个错误。

+0

一次编译所有类。或者像gradle一样使用真正的构建。 –

+0

为什么不使用eclipse或IntelliJ等IDE? –

+0

因为我想知道如何使用IDE或其他工具使事情变得简单之前的工作。下一步将是使用我爱Jetbrains的IntelliJ,但现在只需使用我的“裸手”即可。 – Lucas

回答

0

我错过了导入到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)通知编译器我的类是什么以及包名是什么。

0

与tomcat无关。这是一个正常的编译问题。 在编译时间/阶段期间,编译ArrayList<Computer> computers = new ArrayList<>();时,jvm将查找类计算机,因为您已指定您的数组列表仅包含此类型。但由于此时没有计算机类,它将例外,ClassNotFoundException。要成功运行这个,最好先创建一个类计算机,编译它然后编译这个类。

+0

我写的最后一件事就是这样说的,所以我的问题是如何告诉编译器我的Computer.class在哪里。 – Lucas

+0

把这两个类放在完全相同的packag /路径中,就像这样....如果yor主类在G:/ myFolder/MyMainClass中,并且将您的Computer类也放在G:/ myFolder/ComputerClass中。 –

+0

javac对包的定义很敏感,所以我必须将我的依赖类放在相同的位置,更改包名称并编译主类。这对我来说不是一个可行的解决方案。 – Lucas