Làm cách nào để nhập API javax.servlet trong dự án Eclipse của tôi?


320

Tôi muốn phát triển với Servlets trong Eclipse, nhưng nó nói rằng gói javax.servletkhông thể được giải quyết. Làm cách nào để thêm javax.servletgói vào dự án Eclipse của tôi?


Tôi đang cố gắng chạy một servlet loại từ đơn giản, thông thường nếu tôi muốn tạo một gui tôi sẽ nhập java ...... swing. *; Tôi không thể tìm thấy nhập khẩu đúng cho một servlet
tom

Câu trả lời:


415

Đảm bảo bạn đúng Eclipse và Máy chủ

Đảm bảo rằng bạn đang sử dụng ít nhất IDE Eclipse cho các nhà phát triển Java dành cho doanh nghiệp (với Enterprise ). Nó chứa các công cụ phát triển để tạo các dự án web động và dễ dàng tích hợp các bộ điều khiển dịch vụ (những công cụ này là một phần của Nền tảng công cụ web, WTP). Trong trường hợp bạn đã có IDE Eclipse cho Java (không có Enterprise) và đã cài đặt thủ công một số plugin có liên quan, thì rất có thể nó đã không được thực hiện đúng cách. Bạn muốn dọn rác tốt nhất và lấy IDE Eclipse thực sự cho Java doanh nghiệp.

Bạn cũng cần đảm bảo rằng bạn đã cài đặt một trình điều khiển dịch vụ trên máy của mình, nó thực hiện ít nhất phiên bản API của Servlet giống như trình phục vụ trong môi trường sản xuất, ví dụ như Apache Tomcat , Oracle GlassFish , JBoss AS / WildFly , v.v. tải tập tin ZIP và giải nén nó là đủ. Trong trường hợp Tomcat, không tải xuống định dạng EXE, chỉ dành cho môi trường sản xuất dựa trên Windows. Xem thêm áo Một số cổng (8005, 8080, 8009) được yêu cầu bởi Tomcat Server tại localhost đã được sử dụng .

Một servletcontainer là một triển khai cụ thể của API Servlet. Lưu ý rằng tải xuống Java EE SDK tại Oracle.com về cơ bản có chứa GlassFish. Vì vậy, nếu bạn tình cờ đã tải xuống Java EE SDK, thì về cơ bản bạn đã có GlassFish. Cũng lưu ý rằng ví dụ GlassFish và JBoss AS / WildFly là nhiều hơn chỉ là một servletcontainer, họ cũng hỗ trợ JSF, EJB, JPA và tất cả fanciness Java EE khác. Xem thêm áo chính xác Java EE là gì?


Tích hợp máy chủ trong Eclipse và liên kết nó với Project

Sau khi đã cài đặt cả Eclipse cho Enterprise Java và một trình điều khiển dịch vụ trên máy của bạn, hãy thực hiện các bước sau trong Eclipse:

  1. Tích hợp trình điều khiển servlet trong Eclipse

    a. Xem qua máy chủ

    • Mở giao diện Máy chủ trong hộp dưới cùng.
    • Nhấp chuột phải vào đó và chọn Mới> Máy chủ .
    • Chọn phiên bản và phiên bản servletcontainer thích hợp và đi qua trình hướng dẫn.

      nhập mô tả hình ảnh ở đây

    b. Hoặc, thông qua các tùy chọn Eclipse

    • Mở cửa sổ> Tùy chọn> Máy chủ> Môi trường thời gian chạy .
    • Bạn có thể Thêm , Chỉnh sửaXóa máy chủ tại đây.

      nhập mô tả hình ảnh ở đây

  2. Liên kết máy chủ với dự án

    a. Trong dự án mới

    • Mở Project Navigator / Explorer ở phía bên tay trái.
    • Nhấp chuột phải vào đó và chọn New> Project và sau đó trong menu Web> Dynamic Web Project .
    • Trong trình hướng dẫn, đặt Target Runtime cho máy chủ tích hợp.

      nhập mô tả hình ảnh ở đây

    b. Hoặc, trong dự án hiện có

    • Dự án Rightclick và chọn Thuộc tính .
    • Trong phần Runtimes được nhắm mục tiêu , chọn máy chủ tích hợp.

      nhập mô tả hình ảnh ở đây

    Dù bằng cách nào, Eclipse sau đó sẽ tự động đưa các thư viện của người phục vụ trong đường dẫn xây dựng. Bằng cách này, bạn sẽ có thể nhập và sử dụng API Servlet.


Không bao giờ mang theo các tệp JAR dành riêng cho máy chủ

Trong mọi trường hợp, bạn không cần phải loay hoay trong thuộc tính Build Path của dự án. Bạn nên trên hết là không bao giờ bằng tay copy / download / di chuyển / bao gồm các cá nhân servletcontainer cụ thể các thư viện thích servlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar, javaee.jar, vv Nó sẽ chỉ dẫn đến tính di động trong tương lai, khả năng tương thích, classpath và bảo trì khó khăn, bởi vì webapp của bạn sẽ không hoạt động khi nó được triển khai cho một bộ điều khiển dịch vụ của một phiên bản / phiên bản khác với nơi mà các thư viện ban đầu được lấy từ đó.

Trong trường hợp bạn đang sử dụng Maven, bạn cần chắc chắn rằng các thư viện dành riêng cho người phục vụ đã được cung cấp bởi thời gian chạy đích được đánh dấu là <scope>provided</scope>.

Dưới đây là một số trường hợp ngoại lệ điển hình mà bạn có thể nhận được khi bạn xả rác /WEB-INF/libhoặc thậm chí /JRE/lib, /JRE/lib/ext, vv với các thư viện servletcontainer cụ thể trong một nỗ lực bất cẩn để sửa chữa các lỗi biên dịch:


4
@BalusC Nếu tôi đang sử dụng Apache Ant để xây dựng dự án của mình, làm cách nào để bao gồm thư mục /lib(servlet-api.jar & jsp-api.jar) của thùng chứa servlet? Hoặc tôi cần mã cứng đường dẫn đến thư mục / lib như - <property name="tomcat.home" value="D:\\Program Files\\Apache Software Foundation\\apache-tomcat-6.0.36"/>vv
kaustav datta

1
@BalusC tại sao các dự án maven được tạo với archetype maven-archetype-webappkhông bao gồm JAR servlet-api như một phụ thuộc? Dự án có một index.jsp với lỗi biên dịch. (Eclipse Luna Build id: 20140612-0600, JDK 8, M2eclipse)
arun

1
Các servlet-apiphụ thuộc @arun được cung cấp bởi các môi trường thời gian chạy Servlet như Tomcat, Wildfly, Glassfish, v.v.,. Đừng bao giờ đưa nó vào như một phần của ứng dụng của bạn, vì có khả năng nó sẽ đụng độ với môi trường.
vào

@BalusC, 1) javax.servlet-api-3.1.0.jar có bằng tomcat8 / lib / servlet-api.jar không? Tôi dịch ngược hai cái lọ, sau đó tìm âm thanh của các lớp / giao diện là như nhau. 2) Là javax.servlet-api-3.1.0.jar container trung lập (không phải thư viện dành riêng cho người phục vụ)?
gfan

@gfan: vấn đề kỹ thuật không phải là liệu các thư viện do container cung cấp có phải là "trung lập container" hay không mà là ưu tiên tải lớp và sắp xếp. Nếu các thư viện do container cung cấp được tải bởi trình nạp lớp sai (ví dụ: thông qua trình tải lớp webapp), mọi thứ có thể bị hủy hoại, ngay cả khi nó "trùng hợp" chính xác cùng một phiên bản. Chỉ không cung cấp thư viện cung cấp container từ các địa điểm trùng lặp bên ngoài container. Giai đoạn = Stage.
BalusC

220

nhập javax.servlet

BƯỚC 1

Chuyển đến các thuộc tính của dự án của bạn (với Alt+ Enterhoặc nhấp chuột phải)

BƯỚC 2

kiểm tra Apache Tomcat v7.0 trong Targeted Runtime và nó hoạt động.


2
Đã giúp tôi thêm thời gian chạy JBOSS của tôi. Danh sách của tôi trống rỗng.
kéo dài

2
Đây là giải pháp cho tôi. Tôi đã đặt tomcat 6.0 làm môi trường triển khai (như một máy chủ trong nhật thực), nhưng đã bỏ qua việc chỉ định nó là môi trường thời gian chạy của tôi ... Tôi đoán điều đó có nghĩa là nó có thể tìm thấy .jars trong thư mục tomcat / lib của tôi khi chạy, nhưng không phải lúc biên dịch.
Paul

Cảm ơn! Nhưng làm thế nào tôi có thể xóa bản sao của máy chủ mu? Tôi có Apache Tomcat v7.0 (2) và (3) mà tôi muốn xóa. Có ai biết làm thế nào không?
Robben

Không giúp tôi giải quyết vấn đề với The import javax.servlet cannot be resolved.
mrgloom

1
Những công việc này! Cảm ơn, @mrgloom, bạn có thể muốn xóa máy chủ và tạo một máy chủ mới trong localhost của bạn
Freddie Fabregas

81

Một chút khác biệt từ Hari:

Nhấp chuột phải vào dự án ---> Thuộc tính ---> Đường dẫn xây dựng Java ---> Thêm thư viện ... ---> Thời gian chạy máy chủ ---> Tomcat Apache ----> Kết thúc.


3
Xin chào ivanLam, Apache Tomcat không hiển thị sau Server Runtime? Làm gì bây giờ!
Sandeep Pattanaik

15

Bao gồm servlet-api.jar từ thư mục lib máy chủ của bạn.nhập mô tả hình ảnh ở đây

Làm bước này

nhập mô tả hình ảnh ở đây


1
Giải pháp không hoạt động đối với tôi vẫn nhận được lỗi bên dưới Một container con bị lỗi trong khi khởi động java.util.concản.ExecutException: org.apache.cirthina.LifecyclException: Không thể khởi động thành phần [StandardEngine [Catalina] .St Chuẩnhost [localhost] .St ChuẩnContext [/ sứ giả]]
Maya Mohite

13

Thêm phụ thuộc javax.servlet trong pom.xml. Vấn đề của bạn sẽ được giải quyết.

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

12

Khắc phục nhanh - Điều này hoạt động trong Eclipse - Nhấp chuột phải vào dự án -> Thuộc tính -> Đường dẫn xây dựng Java (Tab) -> Thêm JAR bên ngoài -> xác định vị trí triển khai api jar của servlet (nếu Tomcat - tên là servlet-api.jar) -> nhấn OK Đó là nó !!


14
Có sự tham khảo trên BalusC bài không bao giờ tự sao chép / download / di chuyển / bao gồm các thư viện servletcontainer cụ thể cá nhân như servlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar, javaee.jar, vv Nó sẽ chỉ dẫn đến tính di động trong tương lai, khả năng tương thích, classpath, phiền hà bảo trì.
Aniket Kulkarni

5

bạn có thể chỉ cần sao chép servlet-api.jarvà sao chép các tệp jar đó vào thư mục lib, trong WEB-INF. sau đó chỉ cần dọn dẹp và xây dựng dự án của bạn, lỗi của bạn sẽ được giải quyết.

  **OR**

bạn có thể trực tiếp thêm tệp jar vào thư viện bằng cách sử dụng các bước sau.

  1. Nhấp chuột phải vào dự án.
  2. Chuyển đến Thuộc tính.
  3. Chuyển đến Đường dẫn xây dựng Java.
  4. Chọn Thêm tùy chọn Thư viện từ các tab.
  5. Thêm tệp Jar
  6. đưa ra đường dẫn của servlet-api.jartập tin của bạn .
  7. Làm sạch và xây dựng dự án của bạn.

Downvoting, có sự tham khảo trên BalusC bưu chính, Aniket Kulkarni bình luận, không bao giờ tự sao chép / download / di chuyển / bao gồm các thư viện servletcontainer cụ thể cá nhân như servlet-api.jar, jsp-api.jar, javaee.jar, vv Nó sẽ chỉ dẫn đến tính di động trong tương lai, khả năng tương thích, classpath và bảo trì khó khăn.
el-teedee

5

Tôi biết đây là một bài viết cũ. Tuy nhiên, tôi đã quan sát một trường hợp khác trong đó trong dự án đã có Tomcat được thêm vào nhưng chúng tôi vẫn gặp lỗi này. Đã làm điều này để giải quyết rằng:
Alt + Enter
Facets Project
Bên phải, bên cạnh chi tiết, là một tab khác "Runtimes". Máy chủ tomcat được cài đặt sẽ được liệt kê ở đó. Chọn nó
Lưu cấu hình và làm!

Hy vọng điều này sẽ giúp được ai đó.


3

Từ 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>");
  }
}

Tất nhiên, điều này chỉ hoạt động nếu bạn đã thêm servlet-api.jarđường dẫn xây dựng Eclipse. Thông thường, máy chủ ứng dụng của bạn (ví dụ Tomcat ) sẽ có tệp jar đúng.


3

Đối với các dự án maven thêm phụ thuộc sau:

<!-- 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>

Tài liệu tham khảo

Đối với các dự án lớp:

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

hoặc tải về javax.servlet.jarvà thêm vào dự án của bạn.


2

Tôi đã nhận được một ngoại lệ con trỏ null trong quá trình tạo dự án liên quan đến "Mô-đun Web động".

Để biên dịch dự án (nghĩa là javax.servletđể nhập thành công) tôi đã phải truy cập vào Thuộc tính của dự án , chọn Facets Project trong thanh bên, đánh dấu Mô-đun Web động và bấm Áp dụng .

Đáng ngạc nhiên, lần này khía cạnh "Mô-đun Web động" được cài đặt chính xác và quá trình nhập bắt đầu hoạt động.


2

Trong trường hợp của tôi, khi tôi đến Targetted Runtimes , màn hình, Tomcat 7 không được liệt kê (bị vô hiệu hóa) mặc dù đã được cài đặt.

Để khắc phục, tôi phải truy cập Preferences-> Server-> Runtime Envirments sau đó gỡ cài đặt và cài đặt lại Tomcat 7.


2

Nhiều người trong chúng ta phát triển trong Eclipse thông qua một dự án Maven. Nếu vậy, bạn có thể bao gồm các phụ thuộc Tomcat trong Maven thông qua tomcat-servlet-apitomcat-jsp-apicác tệp. Một tồn tại cho mỗi phiên bản của Tomcat. Thông thường thêm những thứ này với phạm vi providedvào POM của bạn là đủ. Điều này sẽ giữ cho bản dựng của bạn di động hơn.

Nếu bạn nâng cấp Tomcat trong tương lai, bạn chỉ cần cập nhật phiên bản của những chiếc lọ này.


0

Trên hết, bạn không bao giờ nên sao chép / tải xuống / di chuyển / bao gồm các thư viện dành riêng cho người phục vụ riêng lẻ như servlet-api.jar

@BalusC,

Tôi thích sử dụng các lớp chính xác mà ứng dụng của tôi sẽ sử dụng thay vì một lớp do Eclipse cung cấp (khi tôi cảm thấy như một nhà phát triển hoang tưởng).

Một giải pháp khác là sử dụng "Cấu hình đường dẫn xây dựng" của Eclipse> Thư viện> Thêm các tệp bên ngoài và thêm api của servlet vào bất cứ thứ gì mà Container mà người dùng chọn sử dụng.

Và theo dõi giải pháp của @kaustav datta khi sử dụng kiến ​​để xây dựng - có một thuộc tính như tomcat.home hoặc weblogic.home. Tuy nhiên, nó đưa ra một ràng buộc khác là nhà phát triển phải cài đặt Weblogic trên máy cục bộ của mình nếu weblogic đang được sử dụng! Bất kỳ giải pháp sạch hơn?


0

Đây cũng có thể là lý do. tôi đã đưa ra sau đây 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>

Vấn đề chưa được giải quyết là do loại trừ spring-boot-starter-tomcat. Chỉ cần loại bỏ <exclusions>...</exclusions>sự phụ thuộc, nó sẽ giải quyết vấn đề, nhưng hãy đảm bảo rằng việc này cũng sẽ loại trừ máy chủ tomcat được nhúng.

Nếu bạn cần máy chủ tomcat nhúng quá, bạn có thể thêm phụ thuộc tương tự với compile scope.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>compile</scope>
</dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.