2017-03-15 25 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