我的目的是将现有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!)我可以看到该
| += 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仍然无法解释菱形运算符!
真糟糕......任何想法?
非常感谢你!
答案 0 :(得分:0)
您的WAR有WEB-INF/lib/
个与JSP更新版本冲突的条目。
从WAR中删除以下条目。
WEB-INF/lib/jstl-1.1.2.jar
WEB-INF/lib/standard-1.1.2.jar
首先,这些罐子不应该包含在你的WAR文件中。
这些是由JSP容器提供的。
另外,摆脱这个......
webAppContext.setConfigurations(new Configuration[] {
new AnnotationConfiguration(),
new WebInfConfiguration(),
new WebXmlConfiguration(),
new MetaInfConfiguration(),
new FragmentConfiguration(),
new EnvConfiguration(),
new PlusConfiguration(),
new JettyWebXmlConfiguration()
});
...并添加此内容(在创建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");
由于不适合“设置”整个配置列表,请改为使用修改例程。
的示例