ฉันจะนำเข้า javax.servlet API ในโครงการ Eclipse ของฉันได้อย่างไร


326

ฉันต้องการพัฒนาด้วย Servlets ใน Eclipse แต่มันบอกว่าjavax.servletไม่สามารถแก้ไขแพ็คเกจได้ ฉันจะเพิ่มjavax.servletแพ็คเกจในโปรเจ็กต์ Eclipse ของฉันได้อย่างไร


ฉันกำลังพยายามเรียกใช้ servlet ประเภทคำสวัสดีง่ายๆโดยปกติถ้าฉันต้องการสร้าง gui ฉันจะนำเข้า java ...... swing. *; ฉันไม่พบการนำเข้าที่ถูกต้องสำหรับ servlet
พรุ่งนี้

คำตอบ:


419

ตรวจสอบให้แน่ใจว่าคุณมี Eclipse และเซิร์ฟเวอร์ที่ถูกต้อง

ตรวจสอบให้แน่ใจว่าคุณใช้Eclipse IDEอย่างน้อยสำหรับนักพัฒนาEnterprise Java (กับEnterprise ) ประกอบด้วยเครื่องมือในการพัฒนาเพื่อสร้างโครงการเว็บแบบไดนามิกและรวม servletcontainers ได้อย่างง่ายดาย (เครื่องมือเหล่านี้เป็นส่วนหนึ่งของ Web Tools Platform, WTP) ในกรณีที่คุณมี Eclipse IDE สำหรับ Java (ไม่มี Enterprise) อยู่แล้วและติดตั้งปลั๊กอินที่เกี่ยวข้องด้วยตนเองมีโอกาสที่จะทำไม่ถูกต้อง คุณควรทิ้งมันให้ดีที่สุดและคว้า Eclipse IDE จริงสำหรับ Enterprise Java one

คุณต้องตรวจสอบให้แน่ใจว่าคุณมี servletcontainer ที่ติดตั้งอยู่ในเครื่องของคุณแล้วซึ่งใช้อย่างน้อย Servlet API เวอร์ชันเดียวกับ servletcontainer ในสภาพแวดล้อมการผลิตเช่นApache Tomcat , Oracle GlassFish , JBoss AS / WildFlyเป็นต้นโดยปกติแล้วเพียง ดาวน์โหลดไฟล์ ZIP และแตกไฟล์ก็เพียงพอแล้ว ในกรณีของ Tomcat ไม่ได้ดาวน์โหลดรูปแบบ EXE ที่เป็นเพียงสำหรับ Windows ตามสภาพแวดล้อมการผลิต ดูเพิ่มเติมอ่าวหลายพอร์ต (8005, 8080, 8009) ที่จำเป็นโดย Tomcat เซิร์ฟเวอร์ที่ localhost มีอยู่แล้วในการใช้งาน

servletcontainer คือการนำ Servlet API มาใช้อย่างเป็นรูปธรรม โปรดทราบว่าการดาวน์โหลดJava EE SDKที่ Oracle.com โดยทั่วไปจะมี GlassFish ดังนั้นหากคุณเคยดาวน์โหลด Java EE SDK แล้วแสดงว่าคุณมี GlassFish อยู่แล้ว นอกจากนี้ยังทราบว่าตัวอย่างเช่น GlassFish และ JBoss AS / WildFly มีมากขึ้นกว่าเพียงแค่ servletcontainer ที่พวกเขายังสนับสนุน JSF, EJB, JPA และอื่น ๆ ทั้งหมด Java EE ความพอใจ ดูเพิ่มเติมที่ Java EE คืออะไร?


รวมเซิร์ฟเวอร์ใน Eclipse และเชื่อมโยงกับ Project

เมื่อติดตั้งทั้ง Eclipse for Enterprise Java และ servletcontainer บนเครื่องของคุณแล้วให้ทำตามขั้นตอนต่อไปนี้ใน Eclipse:

  1. รวม servletcontainer ใน Eclipse

    ก. ผ่านมุมมองเซิร์ฟเวอร์

    • เปิดมุมมองเซิร์ฟเวอร์ในกล่องด้านล่าง

    • คลิ๊กขวาและมีการเลือกใหม่> เซิร์ฟเวอร์

    • เลือกยี่ห้อและเวอร์ชันของ servletcontainer ที่เหมาะสมและดำเนินการตามวิซาร์ด

      ป้อนคำอธิบายภาพที่นี่

    ข. หรือผ่านการตั้งค่า Eclipse

    • เปิดหน้าต่าง> การตั้งค่า> เซิร์ฟเวอร์> Runtime สภาพแวดล้อม

    • คุณสามารถเพิ่ม , แก้ไขและลบเซิร์ฟเวอร์ที่นี่

      ป้อนคำอธิบายภาพที่นี่

  2. เชื่อมโยงเซิร์ฟเวอร์กับโปรเจ็กต์

    ก. ในโครงการใหม่

    • เปิดProject Navigator / Explorerทางด้านซ้ายมือ

    • คลิ๊กขวาและมีการเลือกใหม่> โครงการและจากนั้นในเมนูเว็บ> โครงการเว็บแบบไดนามิก

    • ในวิซาร์ดตั้งค่ารันไทม์เป้าหมายเป็นเซิร์ฟเวอร์รวม

      ป้อนคำอธิบายภาพที่นี่

    ข. หรือในโครงการที่มีอยู่

    • โครงการคลิ๊กขวาและเลือกProperties

    • ในส่วนTargeted Runtimesเลือกเซิร์ฟเวอร์รวม

      ป้อนคำอธิบายภาพที่นี่

    ไม่ว่าจะด้วยวิธีใด Eclipse จะนำไลบรารีของ servletcontainer ในพา ธ การสร้างโดยอัตโนมัติ ด้วยวิธีนี้คุณจะสามารถนำเข้าและใช้ Servlet API


อย่าพกพาไฟล์ JAR เฉพาะเซิร์ฟเวอร์ที่หลวม

ไม่ว่าในกรณีใดคุณไม่จำเป็นต้องเล่นซอในคุณสมบัติBuild Pathของโครงการ คุณควรข้างต้นทั้งหมดไม่เคยคัดลอก / download / ย้าย / รวมถึงบุคคล servletcontainer เฉพาะห้องสมุดชอบservlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar, javaee.jarฯลฯ มันจะนำไปสู่การพกพาในอนาคตการทำงานร่วมกันปัญหา classpath และการบำรุงรักษาเพราะ webapp ของคุณจะไม่ทำงานเมื่อมัน ปรับใช้กับ servletcontainer ของยี่ห้อ / เวอร์ชันที่แตกต่างจากที่ที่เคยได้รับไลบรารีเหล่านั้นมา

ในกรณีที่คุณกำลังใช้ Maven, คุณต้องให้แน่ใจจริงๆหรือว่าห้องสมุด servletcontainer <scope>provided</scope>ที่เฉพาะเจาะจงที่มีบัญญัติไว้แล้วโดยรันไทม์เป้าหมายถูกทำเครื่องหมายเป็น

นี่คือบางส่วนข้อยกเว้นทั่วไปซึ่งคุณสามารถได้รับเมื่อคุณครอก/WEB-INF/libหรือแม้กระทั่ง/JRE/lib, /JRE/lib/extฯลฯ กับห้องสมุด servletcontainer เฉพาะในความพยายามที่ประมาทในการแก้ไขข้อผิดพลาดในการรวบรวม:


4
@BalusC หากฉันใช้ Apache Ant ในการสร้างโปรเจ็กต์ฉันจะรวมโฟลเดอร์ /lib(servlet-api.jar & jsp-api.jar) ของ servlet container แบบไดนามิกได้อย่างไร หรือฉันต้องฮาร์ดโค้ดพา ธ ไปยังโฟลเดอร์ / lib เช่น - <property name="tomcat.home" value="D:\\Program Files\\Apache Software Foundation\\apache-tomcat-6.0.36"/>etc
kaustav datta

1
@BalusC เหตุใดโครงการ maven จึงถูกสร้างขึ้นด้วย archetype maven-archetype-webappไม่รวมถึง servlet-api JAR เป็นการอ้างอิง โครงการมี index.jsp ที่มีข้อผิดพลาดในการคอมไพล์ (รหัส Eclipse Luna Build: 20140612-0600, JDK 8, M2eclipse)
อรุณ

1
@arun servlet-apidependencies จัดทำโดยสภาพแวดล้อมรันไทม์ของ Servlet เช่น Tomcat, Wildfly, Glassfish เป็นต้น อย่ารวมไว้เป็นส่วนหนึ่งของแอปของคุณเนื่องจากมีความเป็นไปได้ที่ดีที่จะปะทะกับสภาพแวดล้อม
asgs

@BalusC, 1) javax.servlet-api-3.1.0.jar เท่ากับ tomcat8 / lib / servlet-api.jar หรือไม่ ฉันถอดรหัสทั้งสองไหจากนั้นพบว่าคลาส / อินเทอร์เฟซเหมือนกัน 2) javax.servlet-api-3.1.0.jar container-neutral (ไม่ใช่ไลบรารีเฉพาะของ servletcontainer) หรือไม่
gfan

@gfan: ปัญหาทางเทคนิคไม่ใช่ว่าไลบรารีที่จัดให้โดยคอนเทนเนอร์นั้น "เป็นกลาง" แต่มีลำดับความสำคัญในการโหลดและลำดับ หากไลบรารีที่จัดเตรียมไว้ถูกโหลดโดย classloader ที่ไม่ถูกต้อง (เช่นผ่าน webapp classloader) สิ่งต่างๆอาจสร้างความเสียหายได้แม้ว่าจะเป็นเวอร์ชันเดียวกันก็ตาม อย่าจัดเตรียมไลบรารีที่จัดเตรียมไว้ให้จากที่ที่ซ้ำกันภายนอกคอนเทนเนอร์ ระยะเวลา
BalusC

221

นำเข้า javax.servlet

ขั้นตอนที่ 1

ไปที่คุณสมบัติของโครงการของคุณ (ด้วยAlt+ Enterหรือคลิกขวา)

ขั้นตอนที่ 2

ตรวจสอบApache Tomcat v7.0ภายใต้Targeted Runtimeและใช้งานได้


2
ช่วยฉันเพิ่มรันไทม์ JBOSS ของฉัน รายการของฉันว่างเปล่า
ช่วง

2
นี่เป็นทางออกสำหรับฉัน ฉันได้ตั้งค่า tomcat 6.0 เป็นสภาพแวดล้อมการปรับใช้ของฉัน (เป็นเซิร์ฟเวอร์ใน eclipse) แต่ละเลยที่จะระบุว่าเป็นสภาพแวดล้อมรันไทม์ของฉัน ... ฉันเดาว่านั่นหมายความว่ามันสามารถค้นหา. jar ในโฟลเดอร์ tomcat / lib ของฉันที่รันไทม์ แต่ไม่ใช่ในเวลารวบรวม
พอล

ขอบคุณ! แต่ฉันจะลบสำเนาของเซิร์ฟเวอร์ mu ได้อย่างไร? ฉันมี Apache Tomcat v7.0 (2) และ (3) ที่ต้องการลบ ใครรู้วิธีบ้าง
Robben

The import javax.servlet cannot be resolvedไม่ได้ช่วยให้ฉันเพื่อแก้ปัญหาด้วย
mrgloom

1
ได้ผล! ขอบคุณ @mrgloom คุณอาจต้องการลบเซิร์ฟเวอร์และสร้างเซิร์ฟเวอร์ใหม่ในโฮสต์ท้องถิ่นของคุณ
Freddie Fabregas

81

ความแตกต่างเล็กน้อยจาก Hari:

คลิกขวาที่ project ---> Properties ---> Java Build Path ---> Add Library ... ---> Server Runtime ---> Apache Tomcat ----> Finish


3
สวัสดีคุณ ivanLam Apache Tomcat ไม่แสดงหลังจาก Server Runtime? จะทำยังไงล่ะ!
Sandeep Pattanaik

16

รวม servlet-api.jar จากโฟลเดอร์ lib ของเซิร์ฟเวอร์ของคุณป้อนคำอธิบายภาพที่นี่

ทำตามขั้นตอนนี้

ป้อนคำอธิบายภาพที่นี่


1
โซลูชันใช้งานไม่ได้สำหรับฉันที่ยังคงได้รับข้อผิดพลาดด้านล่างคอนเทนเนอร์ลูกล้มเหลวระหว่างเริ่มต้น java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: ล้มเหลวในการเริ่มส่วนประกอบ [StandardEngine [Catalina ]StandardHost [localhost] .StandardContext [/ messenger]]
Maya Mohite

16

เพิ่มการพึ่งพา javax.servlet ใน pom.xml ปัญหาของคุณจะได้รับการแก้ไข

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

13

Quick Fix- สิ่งนี้ใช้ได้ใน Eclipse - คลิกขวาที่โปรเจ็กต์ -> Properties -> Java Build Path (Tab) -> Add External JARs -> ค้นหาการใช้งาน servlet api jar (ถ้า Tomcat - ชื่อ servlet-api.jar) -> คลิกตกลง แค่นั้นแหละ !!


14
มีการอ้างอิงถึงข้างต้น BalusC โพสต์ไม่เคยคัดลอก / download / ย้าย / รวมถึงห้องสมุด servletcontainer เฉพาะของแต่ละบุคคลเช่นservlet-api.jar, jsp-api.jar, el-api.jaR, j2ee.jar, javaee.jarฯลฯ มันเท่านั้นจะนำไปสู่การพกพาในอนาคตการทำงานร่วมกัน classpath และปัญหาการบำรุงรักษา
Aniket Kulkarni

5

คุณสามารถคัดลอกservlet-api.jarและคัดลอกไฟล์ jar นั้นไปยังโฟลเดอร์ lib ซึ่งอยู่ใน WEB-INF จากนั้นทำความสะอาดและสร้างโครงการของคุณข้อผิดพลาดของคุณจะได้รับการแก้ไข

  **OR**

คุณสามารถเพิ่มไฟล์ jar ลงในไลบรารีได้โดยตรงโดยใช้ขั้นตอนต่อไปนี้

  1. คลิกขวาที่โครงการ
  2. ไปที่คุณสมบัติ
  3. ไปที่ Java Build Path
  4. เลือกตัวเลือกเพิ่มไลบรารีจากแท็บ
  5. เพิ่มไฟล์ Jar
  6. ให้เส้นทางของservlet-api.jarไฟล์ของคุณ
  7. ทำความสะอาดและสร้างโครงการของคุณ

downvoting มีการอ้างอิงถึงข้างต้นโพสต์ BalusC และแสดงความคิดเห็น Aniket Kulkarni ไม่เคยคัดลอก / download / ย้าย / รวมถึงบุคคล servletcontainer เฉพาะห้องสมุดชอบservlet-api.jar, jsp-api.jar, javaee.jarฯลฯ มันเท่านั้นจะนำไปสู่การพกพาในอนาคตการทำงานร่วมกัน classpath และปัญหาการบำรุงรักษา
el-teedee

5

ฉันรู้ว่านี่เป็นโพสต์เก่า อย่างไรก็ตามฉันสังเกตเห็นอินสแตนซ์อื่นที่ในโครงการได้เพิ่ม Tomcat แล้ว แต่เรายังคงได้รับข้อผิดพลาดนี้ เพื่อแก้ปัญหานี้:
Alt + Enter
Project Facets
ทางด้านขวาถัดจากรายละเอียดคือแท็บอื่น "Runtimes" เซิร์ฟเวอร์ tomcat ที่ติดตั้งจะแสดงอยู่ที่นั่น เลือกมัน
บันทึกการกำหนดค่าและเสร็จสิ้น!

หวังว่านี่จะช่วยใครบางคนได้


4

สำหรับโครงการ maven เพิ่มการพึ่งพาต่อไปนี้:

<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

ข้อมูลอ้างอิง

สำหรับโครงการ gradle:

dependencies {
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

หรือดาวน์โหลดjavax.servlet.jarและเพิ่มลงในโครงการของคุณ


3

จากwikipedia .

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
                "Transitional//EN\">\n" +
                "<html>\n" +
                "<head><title>Hello WWW</title></head>\n" +
                "<body>\n" +
                "<h1>Hello WWW</h1>\n" +
                "</body></html>");
  }
}

แน่นอนว่าจะใช้งานได้ก็ต่อเมื่อคุณได้เพิ่มservlet-api.jarพา ธ ในการสร้าง Eclipse โดยทั่วไปแอปพลิเคชันเซิร์ฟเวอร์ของคุณ (เช่นTomcat ) จะมีไฟล์ jar ที่ถูกต้อง


2

ฉันได้รับข้อยกเว้นของตัวชี้ null ระหว่างการสร้างโปรเจ็กต์ที่เกี่ยวข้องกับ "Dynamic Web Module"

เพื่อให้ได้โครงการที่จะรวบรวม (ซึ่งก็คือการjavax.servletที่จะนำเข้าเรียบร้อยแล้ว) ผมต้องไปที่โครงการอสังหาริมทรัพย์เลือกแง่มุมโครงการในแถบด้านข้าง, ติ๊กเว็บแบบไดนามิกโมดูลและคลิกสมัคร

น่าแปลกที่คราวนี้ "โมดูลเว็บแบบไดนามิก" ติดตั้งอย่างถูกต้องและการนำเข้าเริ่มทำงาน


2

ในกรณีของฉันเมื่อฉันไปที่Targetted Runtimesหน้าจอ Tomcat 7 ไม่อยู่ในรายการ (ปิดใช้งาน) แม้ว่าจะติดตั้งแล้วก็ตาม

ในการแก้ไขฉันต้องไปที่การตั้งค่า -> เซิร์ฟเวอร์ -> สภาพแวดล้อมรันไทม์จากนั้นถอนการติดตั้งและติดตั้ง Tomcat 7 ใหม่


2

พวกเราหลายคนพัฒนาใน Eclipse ผ่านโครงการ Maven ในกรณีนี้คุณสามารถรวมการอ้างอิง Tomcat ใน Maven ผ่านทางtomcat-servlet-apiและtomcat-jsp-apiขวด มีอยู่สำหรับ Tomcat แต่ละเวอร์ชัน โดยปกติแล้วการเพิ่มสิ่งเหล่านี้ด้วยขอบเขตprovidedให้กับ POM ของคุณก็เพียงพอแล้ว สิ่งนี้จะทำให้งานสร้างของคุณพกพาได้มากขึ้น

หากคุณอัปเกรด Tomcat ในอนาคตคุณเพียงแค่อัปเดตเวอร์ชันของขวดเหล่านี้ด้วย


0

คุณไม่ควรคัดลอก / ดาวน์โหลด / ย้าย / รวมไลบรารีเฉพาะของ servletcontainer ด้วยตนเองเช่น servlet-api.jar

@BalusC,

ฉันต้องการใช้คลาสที่แน่นอนที่แอปพลิเคชันของฉันจะใช้มากกว่าคลาสที่ Eclipse จัดเตรียมให้ (เมื่อฉันรู้สึกเหมือนเป็นนักพัฒนาที่หวาดระแวง)

อีกวิธีหนึ่งคือใช้ Eclipse "Configure Build Path"> Libraries> Add External Jars และเพิ่ม servlet api ของ Container ที่เลือกใช้

และทำตามวิธีแก้ปัญหาของ @kaustav datta เมื่อใช้มดในการสร้าง - มีคุณสมบัติเช่น tomcat.home หรือ weblogic.home อย่างไรก็ตามมันแนะนำข้อ จำกัด อีกประการหนึ่งที่นักพัฒนาต้องติดตั้ง Weblogic บนเครื่องท้องถิ่นของตนหากมีการใช้งานเว็บบล็อก! น้ำยาทำความสะอาดอื่น ๆ หรือไม่?


0

นี่อาจเป็นสาเหตุ pom.xmlฉันได้มาด้วยดังต่อไปนี้

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

spring-boot-starter-tomcatยังไม่ได้แก้ไขปัญหาที่เป็นผลมาจากการยกเว้น เพียงแค่ลบการ<exclusions>...</exclusions>พึ่งพาออกก็จะช่วยแก้ไขปัญหาได้ แต่อย่าลืมว่าการทำเช่นนี้จะไม่รวมเซิร์ฟเวอร์ tomcat ที่ฝังไว้ด้วย

หากคุณต้องการเซิร์ฟเวอร์ tomcat ในตัวคุณสามารถเพิ่มการอ้างอิงเดียวกันกับcompile scope.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>compile</scope>
</dependency>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.