2013-06-26 1 views
4

SDK Java EE 7, Glassfish 4 및 Maven을 사용하고 싶습니다.
맞습니까? 범위에주의를 환기하십시오. 서블릿Java EE 7에서 Servlet, JSP 및 JSTL에 필요한 종속성은 무엇입니까?

1 :

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 

2. JSP의 standart 태그없이 JSTL없이 :

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jsp-api</artifactId> 
    <version>2.0</version> 
</dependency> 
표준 태그와 JSP를 들어

3. "C :"

<dependency> 
    <groupId>taglibs</groupId> 
    <artifactId>standard</artifactId> 
    <version>1.1.2</version> 
</dependency> 
JSTL과 JSP를 들어

4.

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>jstl</artifactId> 
    <version>1.2</version> 
    <scope>runtime</scope> 
</dependency> 

이 정보가 포함되어 어디 사양을 알고 계십니까?

+2

"표준"taglib의 의미를 오해하고 있습니다. 그것은 c 태그 만 포함한다는 의미는 아닙니다. 기본적으로 Apache에서 JSTL 1.1.2를 구현 한 것입니다. 그런 다음 다른 JSTL 1을 사용했습니다.2 구현은 참조 구현 (일반적으로 Sun/Oracle의 구현)입니다. 분명히 서로 충돌 할 것입니다. 기본적으로 두 개의 다른 JSTL 구현으로 끝난다. 당신은 그 중 하나만 선언해야합니다. 글래스 피쉬는 이미 상자에서 꺼내어 배송되므로주의 깊게 범위가 "제공됨"으로 설정되어야합니다. – BalusC

답변

5

프로젝트에 이러한 종속성을 추가하면 안됩니다. 서블릿과 같은 J2EE 사양의 인스턴스화는 애플리케이션 서버 런타임에서 제공해야합니다.

Eclipse에서는 응용 프로그램 서버에 서버 런타임을 추가합니다. 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택하십시오. 그런 다음 경로 작성> 라이브러리 추가> 서버 런타임을 선택하십시오.

+0

JSTL의 기대? 왜 정확히? 글래스 피쉬는 완전한 JEL 컨테이너로 이미 JSTL과 함께 제공됩니다. 실제로 다른 Java EE 아티팩트를 모두 묶지 않는 barebones JSP/Servlet 컨테이너 인 Tomcat과 혼동하지 않으십니까? – BalusC

+0

@BalusC 정확하게 맞습니다! 나는 JSTL을 그 목록에서 제외 시키려고 할 때 Tomcat에 대해 생각하고있었습니다. JSTL 오류를 제외하고 나는 단지 버전 충돌을 일으킬 수 있다는 점을 감안할 때 이러한 라이브러리에 대해 서버에 의존해야한다고 지적하려고했다. –

+1

이 답변은 완전히 잘못되었습니다. Maven은 서버 런타임을 참조하지 않고 웹 애플리케이션을 빌드하므로 어떤 서버를 사용할 수 있는지에 대한 정보가 필요하다. – Jules

3

다양한 옵션이 있습니다. 이 질문에서 제안 된 한 가지 접근 방법은 전체 Java EE API를 가져 오는 것입니다. 그러나 당신은 또한 더 선택적 일 수 있습니다. 당신은 대신 서블릿 API를 포함 할 수 있습니다 (이것은 서블릿 API 3.0.1 용이며 최신 버전이 동일한 유물 데이터를 사용할 수 있지만 이전 버전이 이슈 ID servlet-api 대신 사용) :

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

질문은 의미를 JSTL 패키지는 관련 JSP 종속성을 가져온다. 이것은 사실이 아닙니다 : JSP API를 전혀 사용해야하는 경우에는 종속성이 필요합니다 (단, you don't necessarily need it, as discussed at this question은 주목할 가치가 있습니다). 제가 위에서 보여, 당신은 2.2 사용해야합니다 서블릿 API 3.0.1에 대한 그래서 당신은, the correct version of the JSP API that matches the Servlet API version you're using을 사용해야합니다 서블릿 API에 대한

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

등을 거기에 JSP API에 대한 종속성 데이터되어 변경 사항이; 이 경우 2.0보다 오래된 버전의 경우 그룹 ID는 javax.servlet이고 2.2보다 새로운 버전의 경우 이슈 ID는 javax.servlet.jsp-api으로 변경되었습니다.

JSTL의 경우 버전 1.2를 사용해야합니다. 이 버전의 새 표준 위치는 다음과 같습니다. 질문에 표시된 이전 위치가 계속 올바르게 작동하지만

<dependency> 
     <groupId>javax.servlet.jsp.jstl</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 

아마도이 라이브러리에 향후 업데이트가있을 경우이 그룹/이슈 ID에 포함될 것입니다. 이는 다른 모든 최신 아티팩트와 적절하게 맞춰진 것으로 보입니다. 다른 아티팩트와 달리 컨테이너에서 JSTL을 제공하지 않으므로 범위가 "제공됨"으로 설정되어서는 안됩니다.

관련 문제