将现有的WAR部署到嵌入式Jetty [英] Deploying existing WAR to embedded Jetty

查看:109
本文介绍了将现有的WAR部署到嵌入式Jetty的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的意图是将现有的WAR部署到嵌入式Jetty 9.4.5.

My intention is to deploy an existing WAR to embedded Jetty 9.4.5.

不幸的是,尝试打开页面(JSP)时出现以下错误:

Unfortunately I get the following error when trying to open a page (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中有问题的行如下:

The line in question in Java is as follows:

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).

It seems that Jasper tried to compile the code as Java 1.6 or below so the diamond operator cannot be interpreted (I am having Java 1.8.0_141).

我试图设置版本,但没有成功:

I tried to set the version but no success:

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的代码是

The code that starts Jetty is

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.

Any hint would be highly appreciated!
Thanks, V.

---------------------------更新1 ------------------ ---------
我设置了server.setDumpAfterStart(true);(感谢@JoakimErdfelt作为提示!),并注释掉了设置compilerTargetVM等的代码(因此,我没有将JspServlet添加到webAppContext!),我可以看到

--------------------------- UPDATE 1 ---------------------------
I set the server.setDumpAfterStart(true); (thanks @JoakimErdfelt for the hint!) and commented out the code where I set the compilerTargetVM etc. (so I don't add the JspServlet to webAppContext!) and I can see that

|   += 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无法解释菱形运算符!
兄弟...有什么主意吗?
非常感谢你!

So the Java source is set to 1.7 but still the diamond operator cannot be interpreted by the JVM!
Bummer... Any idea?
Thank you very much!

推荐答案

您的WAR中有WEB-INF/lib/条目与JSP的更新版本冲突.

Your WAR has WEB-INF/lib/ entries that are conflicting with the updated version of JSP.

从WAR中删除以下条目.

Remove the following entries from your WAR.

WEB-INF/lib/jstl-1.1.2.jar
WEB-INF/lib/standard-1.1.2.jar

这些罐子绝不应该首先包含在您的WAR文件中.

Those jars should never have been included in your WAR file in the first place.

这些是由JSP容器提供的.

Those are provided by the JSP Container.

还要摆脱这个...

webAppContext.setConfigurations(new Configuration[] {
          new AnnotationConfiguration(),
          new WebInfConfiguration(),
          new WebXmlConfiguration(),
          new MetaInfConfiguration(),
          new FragmentConfiguration(),
          new EnvConfiguration(),
          new PlusConfiguration(),
          new JettyWebXmlConfiguration()
 });

...并添加它(在创建WebAppContext之前)...

... and add this instead (before you create the 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");

由于不适合设置"整个配置列表,请改用修改例程.

As its inappropriate to "set" the entire configuration list, use the modification routines instead.

示例取自 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

这篇关于将现有的WAR部署到嵌入式Jetty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆