我的意图是将现有的WAR部署到嵌入式Jetty 9.4.5。
不幸的是,尝试打开页面(JSP)时出现以下错误:
An error occurred at line: [52] in the generated java file: [/tmp/embedded-jetty-jsp/jsp/org/apache/jsp/WEB_002dINF/jsp/MainLayout_jsp.java] Type mismatch: cannot convert from HashSet<?> to Set<String> An error occurred at line: [52] in the generated java file: [/tmp/embedded-jetty-jsp/jsp/org/apache/jsp/WEB_002dINF/jsp/MainLayout_jsp.java] Cannot instantiate the type HashSet<?> An error occurred at line: [52] in the generated java file: [/tmp/embedded-jetty-jsp/jsp/org/apache/jsp/WEB_002dINF/jsp/MainLayout_jsp.java] Syntax error on token "<", ? expected after this token
Java中有问题的行如下:
private static final java.util.Set<java.lang.String> _jspx_imports_packages = new java.util.HashSet<>();
似乎Jasper尝试将代码编译为Java 1.6或更低版本,因此无法解释菱形运算符(我使用的是Java 1.8.0_141)。
我试图设置版本,但没有成功:
ServletHolder holderJsp = new ServletHolder("jsp",JspServlet.class); holderJsp.setInitOrder(0); holderJsp.setInitParameter("logVerbosityLevel","DEBUG"); holderJsp.setInitParameter("compilerTargetVM","1.7"); holderJsp.setInitParameter("compilerSourceVM","1.7"); holderJsp.setInitParameter("keepgenerated","true"); webAppContext.addServlet(holderJsp,"*.jsp");
启动Jetty的代码是
public class JettyRunner { private static File getScratchDir() throws IOException { File tempDir = new File(System.getProperty("java.io.tmpdir")); File scratchDir = new File(tempDir.toString(), "embedded-jetty-jsp"); if (!scratchDir.exists()) { if (!scratchDir.mkdirs()) { throw new IOException("Unable to create scratch directory: " + scratchDir); } } return scratchDir; } private static List<ContainerInitializer> jspInitializers() { JettyJasperInitializer sci = new JettyJasperInitializer(); ContainerInitializer initializer = new ContainerInitializer(sci, null); List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>(); initializers.add(initializer); return initializers; } public static void main(String[] args) { Server server = new Server(8080); WebAppContext webAppContext = new WebAppContext(); File warFile = new File("existing.war"); webAppContext.setWar(warFile.getAbsolutePath()); webAppContext.setContextPath("/acme"); webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebInfConfiguration(), new WebXmlConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration(), new PlusConfiguration(), new JettyWebXmlConfiguration() }); webAppContext.setAttribute("javax.servlet.context.tempdir", getScratchDir()); webAppContext.setAttribute("org.eclipse.jetty.containerInitializers", jspInitializers()); webAppContext.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); webAppContext.addBean(new ServletContainerInitializersStarter(webAppContext), true); ServletHolder holderJsp = new ServletHolder("jsp",JspServlet.class); holderJsp.setInitOrder(0); holderJsp.setInitParameter("logVerbosityLevel","DEBUG"); holderJsp.setInitParameter("compilerTargetVM","1.7"); holderJsp.setInitParameter("compilerSourceVM","1.7"); holderJsp.setInitParameter("keepgenerated","true"); webAppContext.addServlet(holderJsp,"*.jsp"); webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/[^/]*jstl.*\\.jar$"); 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"); HashLoginService hashLoginService = new HashLoginService(); hashLoginService.setName("Test Realm"); hashLoginService.setConfig("jetty-realm.properties"); webAppContext.getSecurityHandler().setLoginService(hashLoginService); server.setHandler(webAppContext); // Start Jetty server.start(); server.join(); }
}
任何提示将不胜感激! 谢谢,V。
---------------------------更新1 --------------------- ------ 我设置了server.setDumpAfterStart(true);(感谢@JoakimErdfelt的提示!),并注释掉了我设置compilerTargetVM等的代码(因此我没有将JspServlet添加到webAppContext!),我可以看到
server.setDumpAfterStart(true);
compilerTargetVM
| += org.eclipse.jetty.server.session.SessionHandler483422889==dftMaxIdleSec=1800 - STARTED | | += org.eclipse.jetty.security.ConstraintSecurityHandler@7c75222b - STARTED | | | +- org.eclipse.jetty.security.DefaultAuthenticatorFactory@4c203ea1 | | | += org.eclipse.jetty.servlet.ServletHandler@27f674d - STARTED | | | | += jsp@19c47==org.eclipse.jetty.jsp.JettyJspServlet,jsp=null,order=0,inst=true - STARTED | | | | | +- fork=false | | | | | +- compilerSourceVM=1.7 | | | | | +- logVerbosityLevel=DEBUG | | | | | +- compilerTargetVM=1.7 | | | | | +- scratchdir=/tmp/embedded-jetty-jsp/jsp | | | | | +- xpoweredBy=false
因此,Java源设置为1.7,但JVM仍无法解释菱形运算符! 兄弟…有什么主意吗? 非常感谢你!
您的WAR中的WEB-INF/lib/条目与JSP的更新版本冲突。
WEB-INF/lib/
从您的WAR中删除以下条目。
WEB-INF/lib/jstl-1.1.2.jar WEB-INF/lib/standard-1.1.2.jar
那些jar绝不应该首先包含在您的WAR文件中。
这些由JSP容器提供。
另外,摆脱这个…
webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebInfConfiguration(), new WebXmlConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration(), new PlusConfiguration(), new JettyWebXmlConfiguration() });
…并添加它(在创建之前WebAppContext)…
WebAppContext
Configuration.ClassList classlist = 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");
由于不适合“设置”整个配置列表,请改用修改例程。
取自https://github.com/eclipse/jetty.project/blob/jetty-9.4.8.v20171121/examples/embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java#L186的示例-L195