使用 web.xml 配置嵌入式码头? [英] Configure embedded jetty with web.xml?

查看:18
本文介绍了使用 web.xml 配置嵌入式码头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试生成与我的 Web 应用程序的战争以及带有嵌入式码头的自包含 jar 文件.对于嵌入式码头(jar 文件分发),我添加了一个 servlet,如下所示:

I am trying to generate both a war with my web application as well as a self contained jar file with embedded jetty. For the embedded jetty (the jar file distribution) I add a servlet as follows:

public static void main(String[] args) throws Exception {
    Server server = new Server(8080);

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    server.setHandler(context);

    context.addServlet(new ServletHolder(new HelloServlet()),"/*");

    server.start();
    server.join();
}

war 文件分发使用 web.xml 文件,该文件在 web-app 部分包含以下内容:

The war file distribution uses a web.xml file that contains the following in the web-app section:

<servlet>
    <servlet-class>com.example.HelloServlet</servlet-class>
    <servlet-name>SimplestServer</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

这有效.但是,我想摆脱两种方法之间的重复.即,当我添加一个新的 servlet 时,我只想在一个位置配置它.我可以从嵌入式码头加载和使用 web.xml 文件吗?

This works. However, I want to get rid of the duplication between the two approaches. I.e., when I add a new servlet I want to have to configure it in only one location. Can I load and use the web.xml file from the embedded jetty?

推荐答案

使用 org.eclipse.jetty.webapp.WebAppContext

示例:

package jetty;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class OnWebApp
{
    public static void main(String[] args) throws Exception
    {
        // Create a basic jetty server object that will listen on port 8080.
        // Note that if you set this to port 0 then a randomly available port
        // will be assigned that you can either look in the logs for the port,
        // or programmatically obtain it for use in test cases.
        Server server = new Server(8080);

        // The WebAppContext is the entity that controls the environment in
        // which a web application lives and breathes. In this example the
        // context path is being set to "/" so it is suitable for serving
        // root context requests and then we see it setting the location of
        // the war. A whole host of other configurations are available,
        // ranging from configuring to support annotation scanning in the
        // webapp (through PlusConfiguration) to choosing where the webapp
        // will unpack itself.
        WebAppContext webapp = new WebAppContext();
        webapp.setContextPath("/");
        webapp.setWar("path/to/my/test.war");

        // A WebAppContext is a ContextHandler as well so it needs to be set to
        // the server so it is aware of where to send the appropriate requests.
        server.setHandler(webapp);

        // Start things up! By using the server.join() the server thread will
        // join with the current thread.
        // See http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join()
        // for more details.
        server.start();
        server.join();
    }
}

请注意,您将构建一个普通的 WAR 文件,并将其与 Jetty 一起使用.

Note that you will build a normal WAR file, and use it with Jetty.

如果您有特殊的需求,例如注解扫描或 JNDI,那么您需要进入配置规范.

If you have special requirements such as Annotation scanning or JNDI, then you'll need to get into configuration specification.

// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
org.eclipse.jetty.webapp.Configuration.ClassList classlist =
   org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);

// Enable JNDI
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
   "org.eclipse.jetty.plus.webapp.EnvConfiguration",
   "org.eclipse.jetty.plus.webapp.PlusConfiguration");

// Enable Annotation Scanning
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
  "org.eclipse.jetty.annotations.AnnotationConfiguration");

有关 WebAppContext 中的更长示例,请参阅 ServerWithAnnotations 示例.

For a longer example of this in a WebAppContext, see the ServerWithAnnotations example.

另请注意,您还将使用此技术设置所有 webapp 类加载器规则.这意味着您将有一个用于 web 应用程序的类加载器和另一个用于服务器的类加载器.理解这一点很重要.

Also note that you will have all of the webapp classloader rules in place using this technique as well. Meaning you will have a classloader for the webapp and another one for the server. This is important to understand.

您可以对类加载器的 WebAppContext 进行一些调整,但无法消除它们,只能控制它们的行为方式.

There are a few tweaks you can do to the WebAppContext for classloaders, but you can't eliminate them, just control how they behave.

WebAppContext webapp = new WebAppContext();
// ... various setup of the webapp ...
// Flip the classloader priority from servlet spec where webapp is first to
// Standard java behavior of parent (aka Server classloader) is first.
webapp.setParentLoaderPriority(true);

另见:

这篇关于使用 web.xml 配置嵌入式码头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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