有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当作为OSGi运行时,如何在Jetty中正确初始化WebAppContext?

我正在尝试让Jetty 9.4.30作为一个OSGi服务运行(下面是:https://examples.javacodegeeks.com/enterprise-java/jetty/jetty-osgi-example/和更新版本),它可以承载WebApp捆绑包。我可以部署,servlet也可以正常工作,但JSP不起作用,我一直遇到TLD加载异常,原因是:

Caused by: 
java.lang.NullPointerException
    at org.apache.jasper.JspCompilationContext.getTldResourcePath(JspCompilationContext.java:563)
    at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:430)
    at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:489)

问题几乎与http://bengreen.eu/fancyhtml/quickreference/jettyjsp9error.html中描述的完全相同,除了在本例中,作者使用Jetty作为嵌入式,并且能够设置org。日食码头。使用启动服务器的代码初始化容器

在OSGi中,我没有一个开始的地方——一切都是在捆绑包中发生的。在对配置文件进行了大量的调整(和解构)之后,我觉得我得到的最接近的配置是将代码中执行的配置复制到jetty web中。xml文件(将部署在每个WAB中,其本身并不理想)如下所示:

<Configure id="webappctxt" class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="initList" class="java.util.ArrayList"></New>
    <Call name="setAttribute">
        <Arg>org.eclipse.jetty.containerInitializers</Arg>
        <Arg>
            <Call class="java.util.Arrays" name="asList">
                <Array type="org.eclipse.jetty.plus.annotation.ContainerInitializer">
                    <Item>
                        <New
                            class="org.eclipse.jetty.plus.annotation.ContainerInitializer">
                            <Arg>
                                <New class="org.eclipse.jetty.apache.jsp.JettyJasperInitializer"></New>
                            </Arg>
                            <Arg></Arg>
                        </New>
                    </Item>
                </Array>
            </Call>
        </Arg>
    </Call>
    <Call name="addBean">
        <Arg>
            <New class="org.eclipse.jetty.annotations.ServletContainerInitializersStarter">
                <Arg>
                    <Ref refid="webappctxt" />
                </Arg>
            </New>
        </Arg>
    </Call>
    <Get name="ServletContext">
        <Call name="setAttribute">
            <Arg>org.apache.tomcat.InstanceManager</Arg>
            <Arg>
                <New class="org.apache.tomcat.SimpleInstanceManager"></New>
            </Arg>
        </Call>
    </Get>
</Configure>

运行时,我可以看到组织。日食码头。注释。ServletContainerInitializersStarter,它具有来自平台的TLD(因此我的所有依赖项似乎都在那里!)但是XML版本的代码失败了,因为org有两个构造函数。日食码头。加注释。容器初始化器:

ContainerInitializer​(java.lang.ClassLoader loader, java.lang.String toString)   
ContainerInitializer​(javax.servlet.ServletContainerInitializer target, java.lang.Class<?>[] classes)

。。。Jetty XML代码选择第一个并抛出“java.lang.IllegalArgumentException:参数类型不匹配”

我的WAB当前“需要”的插件有:

Require-Bundle: org.eclipse.jetty.jndi;bundle-version="9.4.30",
 org.mortbay.jasper.apache-jsp;bundle-version="8.5.54",
 org.eclipse.jetty.server;bundle-version="9.4.30",
 org.eclipse.jetty.deploy;bundle-version="9.4.30",
 org.eclipse.jetty.http;bundle-version="9.4.30",
 org.eclipse.jetty.io;bundle-version="9.4.30",
 org.eclipse.jetty.osgi.boot;bundle-version="9.4.30",
 org.eclipse.jetty.security;bundle-version="9.4.30",
 org.eclipse.jetty.servlet;bundle-version="9.4.30",
 org.eclipse.jetty.util;bundle-version="9.4.30",
 org.eclipse.jetty.webapp;bundle-version="9.4.30",
 org.eclipse.jetty.xml;bundle-version="9.4.30",
 org.eclipse.jetty.annotations;bundle-version="9.4.30",
 org.eclipse.jetty.apache-jsp;bundle-version="9.4.30"

。。。并且只有WAB包被设置为自动启动

为完整起见,配置插件的VM参数包括:

-Djetty.home.bundle=jetty-config-bundle -Djava.naming.factory.url.pkgs=org.eclipse.jetty.jndi -Djava.naming.factory.initial=org.eclipse.jetty.jndi.InitialContextFactory

jetty配置包确实包含jetty。xml等文件,它们正在被处理

有谁能告诉我他们是不是已经开始工作了,怎么做的?是否可配置为只工作而不需要jetty web。每个WAB中都有xml,还是我的插件上缺少一个依赖包


共 (0) 个答案