根据在这里找到的指令,当类路径中存在jspjar时,嵌入式jetty无法解析web.xml, 我将以下启动代码放在一起,以嵌入式模式启动具有jsp支持的jetty,但仍然没有运气。我收到以下错误,下面提供了完整的堆栈:
java.lang.NoSuchMethodError: javax.servlet.jsp.tagext.TagAttributeInfo.<init>(Ljava/lang/String;ZLjava/lang/String;ZZLjava/lang/String;ZZLjava/lang/String;Ljava/lang/String;)V
有问题的类javax.servlet.jsp.tagext.TagAttributeInfo在org.mortbay.jasper.apache- jsp-8.0.9.M3.jar中定义。出于其他原因,也需要此jar来引入JasperInitializer类(JettyJasperInitializer的超类)。
我怀疑码头9.2.10.v20150310不建议使用jarorg.mortbay.jasper.apache-jsp-8.0.9.M3.jar。如果是这样,还有什么选择?我应该获得org.apache.jasper.servlet.JasperInitializer和javax.servlet.jsp.tagext.TagAttributeInfo吗?
java.lang.NoSuchMethodError: javax.servlet.jsp.tagext.TagAttributeInfo.<init>(Ljava/lang/String;ZLjava/lang/String;ZZLjava/lang/String;ZZLjava/lang/String;Ljava/lang/String;)V at org.apache.tomcat.util.descriptor.tld.TldRuleSet$Attribute.toTagAttributeInfo(TldRuleSet.java:272) at org.apache.tomcat.util.descriptor.tld.TldRuleSet$TagAttributeRule.end(TldRuleSet.java:150) at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:959) at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at org.apache.xerces.impl.dtd.XMLNSDTDValidator.endNamespaceScope(Unknown Source) at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source) at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1457) at org.apache.tomcat.util.descriptor.tld.TldParser.parse(TldParser.java:76) at org.apache.jasper.servlet.TldScanner.parseTld(TldScanner.java:257) at org.apache.jasper.servlet.TldPreScanned.scanJars(TldPreScanned.java:46) at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:99) at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:103) at org.eclipse.jetty.plus.annotation.ContainerInitializer.callStartup(ContainerInitializer.java:140) at org.eclipse.jetty.annotations.ServletContainerInitializersStarter.doStart(ServletContainerInitializersStarter.java:65) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:274) at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) at org.eclipse.jetty.server.Server.start(Server.java:387) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) at org.eclipse.jetty.server.Server.doStart(Server.java:354) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at webappdev.JettyWebAppTest.init(JettyWebAppTest.java:140) at webappdev.JettyWebAppTest.main(JettyWebAppTest.java:148)
我的启动代码:
public static void main(String[] args) throws Exception { JettyWebAppTest thiss = new JettyWebAppTest(); thiss.init(); } private void init() throws Exception { System.setProperty("java.io.tmpdir", "/tmp/bolek"); System.setProperty("org.apache.jasper.compiler.disablejsr199", "false"); Server server = new Server(8080); WebAppContext context = new WebAppContext(); context.setResourceBase(<myresourcebase>); context.setDescriptor("/WEB-INF/web.xml"); context.setContextPath("/"); context.setParentLoaderPriority(false); context.setAttribute( "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/.*taglibs.*\\.jar$"); context.setAttribute("javax.servlet.context.tempdir", System.getProperty("java.io.tmpdir")); context.setAttribute("org.eclipse.jetty.containerInitializers", this.jspInitializers()); context.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); context.addBean(new ServletContainerInitializersStarter(context), true); context.setClassLoader(this.getUrlClassLoader()); context.addServlet(this.jspServletHolder(), "*.jsp"); server.setHandler(context); server.start(); server.join(); } private ServletHolder defaultServletHolder(URI baseUri) { ServletHolder holderDefault = new ServletHolder("default", DefaultServlet.class); holderDefault.setInitParameter("resourceBase", baseUri.toASCIIString()); holderDefault.setInitParameter("dirAllowed", "true"); return holderDefault; } private List<ContainerInitializer> jspInitializers() { JettyJasperInitializer sci = new JettyJasperInitializer(); ServletContainerInitializer scii; scii = (ServletContainerInitializer)sci; ContainerInitializer initializer = new ContainerInitializer(scii, null); List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>(); initializers.add(initializer); return initializers; } private ClassLoader getUrlClassLoader() { ClassLoader jspClassLoader = new URLClassLoader(new URL[0], this.getClass().getClassLoader()); return jspClassLoader; } private ServletHolder jspServletHolder() { ServletHolder holderJsp = new ServletHolder("jsp", JettyJspServlet.class); holderJsp.setInitOrder(0); holderJsp.setInitParameter("logVerbosityLevel", "DEBUG"); holderJsp.setInitParameter("fork", "false"); holderJsp.setInitParameter("xpoweredBy", "false"); holderJsp.setInitParameter("compilerTargetVM", "1.7"); holderJsp.setInitParameter("compilerSourceVM", "1.7"); holderJsp.setInitParameter("keepgenerated", "true"); return holderJsp; }
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
您有冲突的jar。
发行版中的文件lib/jsp用于JSP的Glassfish实现。
lib/jsp
Glassfish实施现在已被弃用(由于大量的错误且缺乏实施者的更新),在即将发布的Jetty 9.3版本中已将其完全删除。
不要在您的项目中包含这些Glassfish Implementation jar。
仅使用发行版lib/apache-jsp/目录中的4个jar ,这是Apache Jasper JSP实现。
lib/apache-jsp/
Apache Jasper JSP实施受到完全支持,稳定,最新,并拥有活跃而健康的社区和开发人员基础。