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
我也遇到了同样的问题,但是在我做出改变之后它就被吹了。