2010-01-27 37 views
15

Tôi đang viết một ứng dụng web chạy trong một cá thể Jetty được nhúng.không thể nạp thẻ JSTL trong máy chủ Jetty được nhúng

Khi tôi cố gắng để thực hiện một tuyên bố JSTL, tôi nhận được ngoại lệ sau đây:

org.apache.jasper.JasperException: /index.jsp(1,63) PWC6188: Các uri tuyệt đối: http://java.sun.com/jsp/jstl/core không thể được giải quyết trong một trong hai web.xml hoặc các tập tin jar triển khai với ứng dụng này

tôi có lọ sau trên classpath

  • ant-1.6.5.jar
  • ant-1.7.1.jar
  • ant-launcher-1.7.1.jar
  • lõi-3.1.1.jar
  • cầu cảng-6.1.22.jar
  • cầu cảng-util-6.1 .22.jar
  • jsp-2.1-6.1.14.jar
  • jsp-api-2.1.jar
  • JSTL-1.2.jar
  • servlet-api-2.5-20081211.jar
  • servlet-api-2.5-6.1.14.jar
  • chuẩn 1.1.2.jar

web.xml của tôi trông như thế này:

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee h77p://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
    version="2.4"> 
    <display-name>test</display-name> 
</web-app> 

Mã của tôi trông như thế này:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<html> 
    <body> 
     <h2>Hello World!</h2> 
     <%= new java.util.Date() %><br/> 
     ${1+2}<br/> 
     <c:out var="${5+9}"/><br/> 
    </body> 
</html> 

tôi bắt đầu máy chủ Jetty nhúng của tôi như thế này:

Server server = new Server(80); 
WebAppContext context = new WebAppContext("pig-1.0-SNAPSHOT.war","/"); 
server.addHandler(context); 
server.start(); 

Tôi đã dành hai ngày qua thử nghiệm với các kết hợp khác nhau của tệp jar, cấu hình web.xml và khai báo thư viện thẻ nhưng không có kết quả.

Tôi làm cách nào để có được một máy chủ Jetty được nhúng và chạy với sự hỗ trợ JSTL đầy đủ?

Trả lời

4
  • JSTL-1.2.jar
  • chuẩn 1.1.2.jar

này va chạm. Xóa standard-1.1.2.jar. Bạn chỉ nên sử dụng standard-1.1.2.jarchỉ với jstl-1.1.2.jar. Vì JSTL 1.2 tiêu chuẩn JAR đã được hợp nhất thành JSTL JAR, dẫn đến một tệp jstl-1.2.jar duy nhất.

+0

Tốt biết, cảm ơn bạn! Tuy nhiên, sau khi thay đổi này, vấn đề vẫn tồn tại. –

+0

Đảm bảo rằng bạn chưa trích xuất bất kỳ tệp JSTL JAR nào và được bao gồm trong mỗi tệp TLD của nó trong đường dẫn lớp hoặc đã xác định bất kỳ thứ gì trong 'web.xml'. Ngoài ra, hãy đảm bảo rằng bạn chưa đặt/sao chép (các) tệp JAR JSTL ở một nơi khác, ví dụ: trong 'Appserver/lib' hoặc' JRE/lib'. Để cài đặt JSTL về cơ bản tất cả những gì bạn cần làm là đặt tệp JAR trong classpath (ví dụ: '/ WEB-INF/lib') và khai báo thẻ taglib ở trên tệp JSP. Đó nên là nó. Thực sự không có gì cần phải được thực hiện, nếu không nó sẽ va chạm ở đâu đó. – BalusC

0

Trong web.xml của bạn, hãy thử thay đổi "h77p: //java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" để bắt đầu với "http: //" và thấy rằng nếu sửa lỗi.

Tuy nhiên, đó có thể không phải là nguyên nhân cơ bản, vì tôi đã có cùng lỗi khi sử dụng cầu cảng-maven-plugin và tiêu đề taglib JSTL trong JSP của tôi:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

PWC6188: Các uri tuyệt đối: http://java.sun.com/jsp/jstl/core không thể giải quyết trong một trong hai web.xml hoặc các tập tin jar triển khai với ứng dụng này

tôi đang sử dụng dùng ngoài trời của Spring MVC mẫu từ SpringSource Tool Suite, vì vậy tôi không chắc chắn tại sao các plugin Maven cho Jetty chokes trên đó.

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 
<repositories> 
    <repository> 
     <id>maven2-repository.dev.java.net</id> 
     <name>Java.net Repository for Maven</name> 
     <url>http://download.java.net/maven/2/</url> 
     <layout>default</layout> 
    </repository> 
</repositories> 

Và chỉ javax.servlet: JSTL: 1.2 được liệt kê trong phụ thuộc POM tôi, vì nó bây giờ obsoletes taglibs: tiêu chuẩn: 1.1.2, đó là một gợi ý đưa ra ở trên.

8

Jetty 8.0, đã được đẩy làm mặc định khi bạn sử dụng cầu cảng: chạy, có API servlet 3.0. Kể từ phiên bản tiêu chuẩn đó, tiêu chuẩn JSTL được cho là được đưa vào, và các thẻ taglib này không thể nằm trong classpath webapp, chỉ có classpath chuẩn. Tuy nhiên, 8.0.0.M0 quên bao gồm chúng.

Chỉ định 7.1.4.v20100610 đã giúp ích cho tôi.

+0

Giải pháp này cũng phù hợp với tôi, nhưng tôi rất muốn biết vấn đề thực sự là gì. Với cầu cảng 8.x Tôi không gặp vấn đề gì khi chạy "mvn jetty: run" nhưng "mục tiêu java -jar/dependency/jetty-runner.jar target/*. War" sẽ không hoạt động (đó là những gì tôi cần để chạy ứng dụng web của mình) trên heroku). Khi tôi chuyển sang 7.x tất cả mọi thứ dường như kỳ diệu đến với nhau. – kburns

+0

Nó (đã) chỉ là một lỗi trong 8.0M0. – bmargulies

3

@Drew Cảm ơn Drew. Nó works.I đã được googling cho điều này và kết thúc here.What sai lầm của tôi là: Tôi đã sử dụng

    <dependency> 
        <groupId>javax.servlet</groupId> 
        <artifactId>jstl</artifactId> 
        <version>1.1.2</version> 
        <scope>provided</scope> 
       </dependency> 

tôi đã thay đổi nó từ trên để

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

và nó đã làm việc. Ngoài ra tôi đã sử dụng jstls phụ thuộc mà tôi loại bỏ.

8

Các thẻ tag jstl phải nằm trên máy chủ classpath. Bạn có thể thêm một trình nạp lớp vào chuỗi trình nạp lớp hiện tại trước khi khởi động máy chủ. Đó là nguyên tắc được start.jar sử dụng khi nó bắt đầu một máy chủ jetty.

ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader(); 
URL urlTaglibs = new File(PATH_TO_TAGLIBS).toURI().toURL(); 
URLClassLoader newClassLoader = new URLClassLoader(new URL[]{urlTaglibs},currentClassLoader); 
Thread.currentThread().setContextClassLoader(newClassLoader); 

server.start(); 

Bạn cũng nên thêm nó vào java bắt đầu đối số dòng lệnh.

+0

+1 Đối với * một giải pháp *: câu hỏi này lặp đi lặp lại 10 lần trong SO và tất cả các giải pháp được đề xuất (thêm JST JST rõ ràng vào META-INF \ MANIFEST.MF, xóa các servlet JARs va chạm vv) đơn giản là không hoạt động. Cảm ơn bạn Arsouille! –

0

Tôi cũng gặp vấn đề tương tự. Tôi đã sửa lỗi bằng cách thêm mã bên dưới:

public static final String[] TLD_JAR_NAMES = new String[]{"sitemesh", "spring-webmvc", "shiro-web", "springside-core"}; 
... 
JettyFactory.setTldJarNames(server, TLD_JAR_NAMES); 

Có thể bạn có thể thử. Vui lòng thay thế TLD_JAR_NAMES bằng tên TLD Jar thực của bạn.

2

Tôi có cùng một vấn đề trên Jetty 7, Tôi giải quyết nó bằng cách cho phép Jetty để tìm kiếm TLD:

tôi đã làm nó bằng cách thiết lập một thuộc tính vào bối cảnh:

Server server = new Server(80); 
WebAppContext context = new WebAppContext("pig-1.0-SNAPSHOT.war","/"); 
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", 
    ".*/.*jsp-api-[^/]*\\.jar$|.*/.*jsp-[^/]*\\.jar$|.*/.*taglibs[^/]*\\.jar$"); 
server.addHandler(context); 
server.start(); 

Tham khảo http://wiki.eclipse.org/Jetty/Howto/Configure_JSP#Using_JSTL_Taglibs_for_Jetty_7.x_and_8.x để biết thêm chi tiết.

Trong dự án của tôi (sử dụng maven), tôi có TLD tiêu chuẩn nằm trên JAR "org.apache.taglibs.standard.glassfish-1.2.0.v2011120803.jar" và về mặt lý thuyết nó sẽ là đủ để sử dụng như giá trị cho ContainerIncludeJarPattern mẫu sau:

".*/org\\.apache\\.taglibs\\.standard\\.glassfish-1\\.2\\.0\\.v201112081803\\.jar" 

Nó thực sự hoạt động và nó là một xác nhận của nơi làm cầu cảng tìm thấy libs thẻ, nhưng tôi đã ưa thích rời mô hình trước đó mà tôi tìm thấy trên trang wiki.eclipse.org liên kết ở trên.

Nó có thể được yêu cầu để mở rộng mô hình nếu bạn muốn bao gồm libs thẻ tùy chỉnh.

2

tôi đã có cùng một vấn đề và phát hiện ra rằng http://java.sun.com/jsp/jstl/core được coi là URI hệ thống đơn và tất cả các định nghĩa thẻ tag t mũ cố gắng để xác định nó được bỏ qua (nhưng khi được tham chiếu, một lỗi xảy ra anyway).

tôi đã sử dụng những điều sau trước khi bắt đầu Jetty và bây giờ nó hoạt động:

try { 
    Field f = TldScanner.class.getDeclaredField("systemUris"); 
    f.setAccessible(true); 
    ((Set)f.get(null)).clear(); 
} catch (Exception e) { 
    throw new RuntimeException("Could not clear TLD system uris.",e); 
} 
+0

Làm thế nào trong tên của Hades ... điều này đã làm nó, nó cố định vấn đề của tôi. Cảm ơn! –

+0

cảm ơn bạn rất nhiều – littlejedi

+0

Bạn được hoan nghênh. Rất vui khi có thể trả lại ... :) – Daniel

0

Bằng cách thêm đoạn mã sau tôi đã thoát khỏi những vấn đề:

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>jasper</artifactId> 
    <version>6.0.29</version> 
</dependency> 

Tôi đang sử dụng cầu cảng-Á hậu 8 .

1

Hai bước :

1) thêm chú thích hỗ trợ cho máy chủ

// Enable phân tích cú pháp của các bộ phận liên quan đến jndi của web.xml và cầu cảng-env.xml, #server là

org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server); 
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration"); 

2) thêm thuộc tính sau cho WebAppContext

context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/org.apache.taglibs.taglibs-standard-impl-.*\\.jar$"); 
Các vấn đề liên quan