Jetty 9绝对的uri:http://java.sun.com/jsp/jstl/core无法解析

我在用着

  • Jetty 9嵌入式。
  • Maven的
  • Java 1.7
  • JSTL

当我在Eclipse中运行我的应用程序并浏览到包含JSTL标记的网页时,它可以正常工作。 当我将它捆绑在一个可执行的jar中并从cmd提示符运行时,我得到了

org.apache.jasper.JasperException:/jsp/pcReport.jsp(4,62)PWC6188:绝对uri: http : //java.sun.com/jsp/jstl/core无法在web.xml或者使用此应用程序部署的jar文件

我的依赖

 javax.servlet jstl 1.2   org.eclipse.jetty jetty-webapp 9.0.6.v20130930   org.mortbay.jetty jsp-2.1-glassfish 2.1.v20100127  

我的插件

   org.apache.maven.plugins maven-jar-plugin 2.4    com.pricemon.server.Main webapp/WEB-INF/lib/ true   etc/      org.apache.maven.plugins maven-assembly-plugin 2.4   assembly.xml     make-assembly package  single     

web.xml中

    spring org.springframework.web.servlet.DispatcherServlet 1   spring /   

我在我的Manifest类路径下的WEB-INF / lib下有我的JSTL jar

我只是无法弄清楚为什么这在eclipse下运行时有效但从可执行jar运行时不会工作。 我也尝试在启动时手动添加到classpath而不起作用

 java -classpath ./jstl-1.2.jar -jar app.jar 

我错过了一些明显的东西!?

我遇到了同样的问题,但最近没有找到答案。 我不得不调试glassfish代码来解决它。 我希望以下解释能够帮助他人。

关于依赖关系,要使用带有glassfish的JSP运行,您将需要:

  org.eclipse.jetty jetty-jsp 9.2.3.v20140905   org.eclipse.jetty.toolchain jetty-jsp-jdt 2.3.3  

你的嵌入式Jetty无法加载核心的原因,即使你有一个JSLT 1.2jar子(可能来自glassfish的javax.servlet.jsp.jstl.jar )是因为TldScanner类包含在用于JSP的glassfish jar中。 要清楚这个类有一些静态的:

 197 static { 198 systemUrisJsf.add("http://java.sun.com/jsf/core"); 199 systemUrisJsf.add("http://java.sun.com/jsf/html"); 200 systemUris.add("http://java.sun.com/jsp/jstl/core"); 201 } 

并且由于阻塞,它不会在JAR中加载TLD

 515 private void mapTldLocation(String resourcePath, TldInfo tldInfo, 516 boolean isLocal) { 517 518 String uri = tldInfo.getUri(); 519 if (uri == null) { 520 return; 521 } 522 523 if ((isLocal 524 // Local tld files override the tlds in the jar files, 525 // unless it is in a system jar (except when using myfaces) 526 && mappings.get(uri) == null 527 && !systemUris.contains(uri) 528 && (!systemUrisJsf.contains(uri) || useMyFaces) 529 ) || 530 (!isLocal 531 // Jars are scanned bottom up, so jars in WEB-INF override 532 // thos in the system (except when using myfaces) 533 && (mappings.get(uri) == null 534 || systemUris.contains(uri) 535 || (systemUrisJsf.contains(uri) && !useMyFaces) 536 ) 537 ) 538 ) { ... 

如果url为“ http://java.sun.com/jsp/jstl/core ”并且存储在本地jar中,则无法加载您的TLD。 要使其为NOT LOCAL,应用程序必须由父类包含JSTL jar的类加载器加载。 简而言之,您需要修改代码以初始化WebAppContext ,如下所示:

  ... WebAppContext webapp = new WebAppContext(); // classURLs may contains URL to WEB-INF/classes or WEB-INF/lib/additional_jar of you web app URLClassLoader classLoader = new URLClassLoader(classURLs.toArray(new URL[classURLs.size()]), Thread.currentThread().getContextClassLoader()); webapp.setClassLoader(classLoader); ... ContextHandlerCollection contextCollection = new ContextHandlerCollection(); contextCollection.addHandler(webapp); ... Server server = new Server(threadPool); server.setHandler(contextCollection); server.start(); ... 

如果这没有帮助,我想了解如何在您的应用程序中嵌入Jetty。

您有JSTL的冲突/重复工件。

简化您的依赖项。

    org.eclipse.jetty jetty-jsp 9.0.6.v20130930    org.eclipse.jetty jetty-webapp 9.0.6.v20130930    

您可以看到我们不使用JSTL工件和org.mortbay.jetty提供的jsp支持级别。
Jetty提供了一个元依赖项来引入工件,以便在与Jetty-webapp工件相同的Jetty版本上支持JSP。

你应该使用:

   org.eclipse.jetty apache-jstl ${jetty-version}  

代替:

   javax.servlet jstl 1.2  

我也遇到了同样的问题,但是在我做出改变之后它就被吹了。