Eclipse 프로젝트에서 javax.servlet API를 가져 오려면 어떻게합니까?


320

Eclipse에서 서블릿으로 개발하고 싶지만 패키지 javax.servlet를 해결할 수 없다고 말합니다 . javax.servletEclipse 프로젝트에 패키지를 추가 하려면 어떻게 해야합니까?


나는 간단한 hello word type 서블릿을 실행하려고 노력하고 있습니다. 일반적으로 gui를 만들고 싶다면 java ... swing. *; 서블릿에 대한 올바른 가져 오기를 찾을 수 없습니다
tom

답변:


415

올바른 Eclipse 및 서버인지 확인하십시오

Enterprise Java 개발자 ( Enterprise 와 함께) 용 Eclipse IDE 이상을 사용하고 있는지 확인하십시오 . 여기에는 동적 웹 프로젝트를 작성하고 서블릿 컨테이너를 쉽게 통합 할 수있는 개발 도구가 포함되어 있습니다 (이 도구는 WTP 웹 도구 플랫폼의 일부 임). 이미 Java 용 Eclipse IDE (Enterprise 제외)가 있고 일부 관련 플러그인을 수동으로 설치 한 경우 제대로 수행되지 않았을 가능성이 있습니다. 그것을 버리고 가장 좋은 방법은 Enterprise Java 용 실제 Eclipse IDE를 사용하는 것입니다.

또한 프로덕션 환경에서 최소한 서블릿 컨테이너와 동일한 서블릿 API 버전 (예 : Apache Tomcat , Oracle GlassFish , JBoss AS / WildFly 등) 을 구현하는 서블릿 컨테이너가 시스템에 이미 설치되어 있는지 확인해야합니다 . ZIP 파일을 다운로드하고 압축을 풀면 충분합니다. Tomcat의 경우 EXE 형식을 다운로드 마십시오 . 이는 Windows 기반 프로덕션 환경 전용입니다. ao localhost의 Tomcat Server에 필요한 여러 포트 (8005, 8080, 8009)가 이미 사용 중 입니다.

서블릿 컨테이너는 서블릿 API의 구체적인 구현입니다. 점을 유의 자바 EE SDK의 Oracle.com에서 다운로드가 기본적으로 글래스 피쉬가 포함되어 있습니다. 따라서 Java EE SDK를 이미 다운로드 한 경우 기본적으로 GlassFish가 있습니다. 또한 GlassFish 및 JBoss AS / WildFly는 서블릿 컨테이너 이상의 기능을 제공하며 JSF, EJB, JPA 및 기타 모든 Java EE 성능도 지원합니다. ao Java EE 란 무엇입니까?


Eclipse에서 서버를 통합하고 Project와 연결

시스템에 Enterprise Java 용 Eclipse와 서블릿 컨테이너를 모두 설치했으면 Eclipse에서 다음 단계를 수행하십시오.

  1. Eclipse에서 서블릿 컨테이너 통합

    ㅏ. 서버보기를 통해

    • 열기 서버가 아래 상자에 볼 수 있습니다.
    • 거기를 마우스 오른쪽 버튼으로 클릭하고 새로 만들기> 서버를 선택하십시오. .
    • 적절한 서블릿 컨테이너 제조업체 및 버전을 선택하고 마법사를 안내하십시오.

      여기에 이미지 설명을 입력하십시오

    비. 또는 Eclipse 환경 설정을 통해

    • 열기 창> 환경 설정> 서버> 런타임 환경 .
    • 여기에서 서버를 추가 , 편집제거 할 수 있습니다 .

      여기에 이미지 설명을 입력하십시오

  2. 서버와 프로젝트 연결

    ㅏ. 새 프로젝트에서

    • 프로젝트 네비게이터 / 탐색기를 엽니 다왼쪽 를 .
    • 거기에서 마우스 오른쪽 버튼을 클릭하고 새로 만들기> 프로젝트 를 선택한 다음 메뉴 웹> 동적 웹 프로젝트에서 .
    • 마법사에서 대상 런타임 을 통합 서버로 설정하십시오 .

      여기에 이미지 설명을 입력하십시오

    비. 또는 기존 프로젝트에서

    • 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오 .
    • 에서 대상 런타임의 섹션에서 통합 서버를 선택합니다.

      여기에 이미지 설명을 입력하십시오

    어느 쪽이든, Eclipse는 자동으로 빌드 경로에서 서블릿 컨테이너의 라이브러리를 가져옵니다. 이 방법으로 서블릿 API를 가져오고 사용할 수 있습니다.


느슨한 서버 특정 JAR 파일을 가지고 다니지 마십시오.

어떤 경우 든 프로젝트 의 빌드 경로 특성 을 피할 필요가 없습니다 . 당신은 위의 모든해야 결코 수동으로 복사 / 다운로드 / 이동이 / 라이브러리이 좋아하는 개별 servletcontainer 별을 포함 servlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar,javaee.jar 당신의 웹 애플리케이션은 그렇지 않은 일입니다 것입니다 경우 때문에, 그것은 단지 미래의 이식성, 호환성, 클래스 경로 및 유지 보수 문제로 이어질 것 등 해당 라이브러리를 원래 얻은 위치와 다른 make / version의 서블릿 컨테이너에 배포했습니다.

Maven을 사용하는 경우 대상 런타임에서 이미 제공 한 서블릿 컨테이너 특정 라이브러리가로 표시되어 있는지 확인해야합니다 <scope>provided</scope>.

여기 때 당신에게 쓰레기 당신이 얻을 수있는 몇 가지 일반적인 예외 인 /WEB-INF/lib또는 /JRE/lib, /JRE/lib/ext등 컴파일 오류를 수정 부주의 시도에서 servletcontainer 특정 라이브러리를 :


4
@BalusC Apache Ant를 사용하여 프로젝트를 빌드하는 경우 서블릿 컨테이너의 /lib(servlet-api.jar & jsp-api.jar) 폴더를 동적으로 포함시키는 방법은 무엇입니까? - 아니면 내가 하드 코드에 / lib 폴더와 같은 경로 필요합니까 <property name="tomcat.home" value="D:\\Program Files\\Apache Software Foundation\\apache-tomcat-6.0.36"/>
kaustav DATTA

1
@BalusC 왜 maven-archetype-webapp서블릿 -api JAR을 의존성으로 포함하지 않는 아키 타입으로 maven 프로젝트가 생성 됩니까? 프로젝트에 컴파일 오류가있는 index.jsp가 있습니다. (이클립스 루나 빌드 ID : 20140612-0600, JDK 8, m2eclipse에)

1
@arun servlet-api종속성은 Tomcat, Wildfly, Glassfish 등과 같은 Servlet 런타임 환경에서 제공됩니다. 환경과 충돌 할 가능성이 높으므로 앱에 포함시키지 마십시오.
ass

@BalusC, 1) javax.servlet-api-3.1.0.jar이 tomcat8 / lib / servlet-api.jar와 같은가요? 두 항아리를 디 컴파일 한 다음 클래스 / 인터페이스의 moust가 동일하다는 것을 알았습니다. 2) javax.servlet-api-3.1.0.jar container-neutral (서블릿 컨테이너 특정 라이브러리 아님)입니까?
gfan

@gfan : 기술적 문제는 컨테이너 제공 라이브러리가 "컨테이너 중립적"인지 여부가 아니라 클래스 로딩 우선 순위 및 순서입니다. 컨테이너 제공 라이브러리가 잘못된 클래스 로더 (예 : webapp 클래스 로더를 통해)에 의해로드되는 경우 "동일하게"정확히 동일한 버전 인 경우에도 문제가 발생할 수 있습니다. 컨테이너 외부의 중복 된 장소에서 컨테이너 제공 라이브러리를 제공하지 마십시오. 기간.
BalusC

220

javax.servlet 가져 오기

1 단계

프로젝트의 속성 으로 이동 하십시오 ( Alt+ Enter또는 마우스 클릭으로)

2 단계

확인 아파치 톰캣 7.0 에서 대상 런타임 과 작동합니다.


2
JBOSS 런타임을 추가하는 데 도움이되었습니다. 내 목록이 비어있었습니다.
스팬

2
이것이 나를위한 해결책이었습니다. Tomcat 6.0을 배포 환경 (일식 서버)으로 설정했지만 런타임 환경으로 지정하지 않았습니다 ... 런타임에 tomcat / lib 폴더에서 .jars를 찾을 수 있다고 생각합니다. 컴파일 타임에는 아닙니다.
Paul

감사! 그러나 mu 서버 사본을 어떻게 삭제합니까? 삭제하려는 Apache Tomcat v7.0 (2) 및 (3)이 있습니다. 누구나 방법을 알고 있습니까?
Robben

문제를 해결하는 데 도움이되지 않았습니다 The import javax.servlet cannot be resolved.
mrgloom

1
작동합니다! 감사합니다, @mrgloom, 서버를 제거하고 로컬 호스트에 새 서버를 만들 수 있습니다
Freddie Fabregas

81

Hari와의 약간의 차이 :

프로젝트 ---> 특성 ---> Java 빌드 경로 ---> 라이브러리 추가 ... ---> 서버 런타임 ---> Apache Tomcat ----> 완료를 마우스 오른쪽 단추로 클릭하십시오.


3
안녕하세요 ivanLam, Apache Tomcat이 서버 런타임 후에 표시되지 않습니까? 지금 무엇을해야합니까!
Sandeep Pattanaik

15

서버 lib 폴더에서 servlet-api.jar을 포함하십시오.여기에 이미지 설명을 입력하십시오

이 단계를 수행

여기에 이미지 설명을 입력하십시오


1
솔루션이 여전히 작동하지 않습니다. 오류가 계속 발생합니다. java.util.concurrent.ExecutionException을 시작하는 동안 하위 컨테이너가 실패했습니다. org.apache.catalina.LifecycleException : 컴포넌트 [StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/를 시작하지 못했습니다. 메신저]]
Maya Mohite

13

pom.xml에 javax.servlet 종속성을 추가하십시오. 문제가 해결 될 것입니다.

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

12

빠른 수정-Eclipse에서 작동했습니다-프로젝트-> 속성-> Java 빌드 경로 (Tab)-> 외부 JAR 추가-> 서블릿 API jar 구현 찾기 (Tomcat-이름이 servlet-api.jar 인 경우)-> 확인을 클릭하십시오. 그게 다야 !!


14
결코 수동으로 복사 BalusC 포스트 위를 참조 / 다운로드 / 이동 /와 같은 개인 servletcontainer 특정 라이브러리를 포함 servlet-api.jar, jsp-api.jar, el-api.jaR, j2ee.jar, javaee.jar, 등 그것은 단지 미래의 이식성, 호환성, 클래스 경로 및 유지 보수의 문제로 이어질 것입니다.
Aniket Kulkarni

5

당신은 단순히 복사 할 수 있습니다 servlet-api.jar및 WEB-INF에 lib 디렉토리 폴더에 그 jar 파일을 복사합니다. 그런 다음 프로젝트를 정리하고 빌드하면 오류가 해결됩니다.

  **OR**

다음 단계를 사용하여 jar 파일을 라이브러리에 직접 추가 할 수 있습니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 속성으로 이동하십시오.
  3. Java 빌드 경로로 이동하십시오.
  4. 탭에서 라이브러리 추가 옵션을 선택하십시오.
  5. Jar 파일 추가
  6. servlet-api.jar파일 경로를 지정하십시오 .
  7. 프로젝트를 정리하고 빌드하십시오.

BalusC 포스트와 아니 켓 Kulkarni 코멘트 위를 참조하여, Downvoting, 결코 수동으로 복사 / 다운로드 / 이동 /와 같은 개인 servletcontainer 특정 라이브러리를 포함 servlet-api.jar, jsp-api.jar, javaee.jar, 등 그것은 단지 미래의 이식성, 호환성, 클래스 경로 및 유지 보수 문제로 이어질 것입니다.
el-teedee

5

나는 이것이 오래된 게시물이라는 것을 알고있다. 그러나 프로젝트에 이미 Tomcat이 추가 된 다른 인스턴스가 있지만 여전히이 오류가 발생합니다. : 것을 해결하기 위해 이런 짓을
Alt 키 +가 입력
프로젝트 패싯을
다음의 세부 사항에, 다른 탭 "런타임"입니다 오른쪽에. 설치된 Tomcat 서버가 여기에 나열됩니다. 그것을 선택하십시오.
구성을 저장하고 완료하십시오!

이것이 누군가를 돕기를 바랍니다.


3

에서 위키 피 디아 .

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.jarEclipse 빌드 경로에 추가 한 경우에만 작동 합니다. 일반적으로 애플리케이션 서버 (예 : Tomcat )에 올바른 jar 파일이 있습니다.


3

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프로젝트에 다운로드 하여 추가하십시오.


2

"Dynamic Web Module"과 관련된 프로젝트 생성 중에 널 포인터 예외가 발생했습니다.

프로젝트를 컴파일하려면 (즉, javax.servlet성공적으로 가져 오려면) 프로젝트의 속성 으로 이동 하고 사이드 바에서 프로젝트 패싯 을 선택한 다음 동적 웹 모듈을 선택 하고 적용을 클릭해야 합니다.

놀랍게도 이번에는 "Dynamic Web Module"패싯이 올바르게 설치되었고 가져 오기가 작동하기 시작했습니다.


2

필자의 경우 Targetted Runtimes , 화면으로 이동하면 Tomcat 7이 설치되어 있어도 목록에 표시되지 않습니다 (비활성화 됨).

수정하려면 환경 설정-> 서버-> 런타임 환경으로 이동 한 다음 Tomcat 7을 제거하고 다시 설치해야했습니다.


2

우리 중 많은 사람들이 Maven 프로젝트를 통해 Eclipse에서 개발합니다. 그렇다면 Maven에 tomcat-servlet-apitomcat-jsp-apijar 를 통해 Tomcat 종속성을 포함시킬 수 있습니다 . Tomcat의 각 버전마다 하나씩 존재합니다. 일반적으로 이러한 범위 provided를 POM에 추가하면 충분합니다. 이렇게하면 빌드를보다 이식 가능하게 유지할 수 있습니다.

나중에 Tomcat을 업그레이드하는 경우 이러한 jar 버전도 업데이트하기 만하면됩니다.


0

servlet-api.jar와 같은 개별 서블릿 컨테이너 특정 라이브러리를 수동으로 복사 / 다운로드 / 이동 / 포함하지 않아야합니다.

@BalusC,

Eclipse에서 제공하는 클래스가 아닌 응용 프로그램에서 사용할 정확한 클래스를 사용하는 것을 선호합니다 (편집증 개발자처럼 느낄 때).

또 다른 해결책은 Eclipse "빌드 경로 구성"> 라이브러리> 외부 jar 추가를 사용하고 컨테이너가 사용하도록 선택한 모든 서블릿 API를 추가하는 것입니다.

antcat을 사용하여 빌드 할 때 @kaustav datta의 솔루션을 따르십시오-tomcat.home 또는 weblogic.home과 같은 속성이 있습니다. 그러나 weblogic을 사용하는 경우 개발자가 로컬 시스템에 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 서버가 필요한 경우에도 동일한 종속성을 추가 할 수 있습니다 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.