【问题标题】:How to allow a web-app to use jetty server classes?如何允许网络应用使用码头服务器类?
【发布时间】:2014-03-12 14:37:44
【问题描述】:

我正在使用 9 号码头。 我需要在我的网络应用程序中使用码头服务器库中的一个类,例如org.eclipse.jetty.servlet.ServletContextHandler。当 jetty 启动时,它会将其库包含在类路径中。但是当我尝试从我的网络应用程序中使用它时,我得到了 class not found 异常。我猜 WEB-INF/lib 类和码头服务器类是由不同的类加载器加载的。所以我在 etc/jetty-deploy.xml 中添加到 WebAppProvider

<Set name="parentLoaderPriority">true</Set>

希望 webapp 类加载器将类加载委托给其父级。但这没有帮助。

【问题讨论】:

    标签: jetty


    【解决方案1】:

    我使用的是jetty 8,我在webapp jetty-web.xml中设置了参数:

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">
      ...
      <Set name="parentLoaderPriority">true</Set>
      ...
    </Configure>
    

    但参数本身是不够的,因为@987654321@ 避免了“系统”和“服务器”类,请参阅jetty classloading doc。因此,为了允许例如来自org.eclipse.jetty.util 的服务器类,您需要告诉您的 web 应用程序,例如由

      <Set name="parentLoaderPriority">true</Set>
      <Call name="addServerClass">
        <Arg>-org.eclise.jetty.util</Arg>
      </Call>
    

    (包名前的'-'表示“删除”而不是添加)

    【讨论】:

      【解决方案2】:

      我将在这里描述什么对我有用。这可能会在 Jetty 的未来版本中发生变化,因此请确保您使用的版本与这些配置兼容。

      我的码头版本:9.4.5.v20170502。

      第 1 步:不要更改任何 Jetty 内部文件

      在尝试使事情正常运行时,我们有时会更改服务器的内部配置,希望它会有所作为。虽然我认为可以在服务器级别设置此配置,但我强烈反对这样做,因为它会使您的应用程序无法跨不同的 Jetty 服务器移植。

      第 2 步:将您需要的所有与 Jetty 相关的 JAR 移动到您的类路径中

      这意味着将jetty-server-&lt;version&gt;.jarjetty-servlets-&lt;version&gt;.jar 和您需要的任何其他jetty-&lt;something&gt;-&lt;version&gt;.jar 复制到您的WEB-INF/lib 目录中。

      如果您使用 Maven,只需在 pom.xml 中声明这些依赖项,无需指定任何范围。

      还有其他方法可以将这些文件包含在您的类路径中,但同样,出于可移植性原因,我不鼓励更改任何服务器文件。

      第 3 步:创建 jetty-web.xml 文件

      此文件包含特定于 Jetty 的设置。它位于WEB-INF,与web.xml 文件所在的位置相同。

      然后,在这个jetty-web.xml 中,使用以下结构:

      <?xml version="1.0"  encoding="UTF-8"?>
      <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
      
      <Configure class="org.eclipse.jetty.webapp.WebAppContext">
        <Set name="parentLoaderPriority">true</Set>
        <Call name="addServerClass">
          <Arg>-org.eclipse.jetty.server.</Arg>
        </Call>
        <Call name="addServerClass">
          <Arg>-org.eclipse.jetty.http.</Arg>
        </Call>
      </Configure>
      

      (使用您要导入的类的包。您可以通过重复Call 结构添加任意数量的类或包)。

      请注意软件包名称前面的- 符号 - 这意味着服务器应该从禁止列表中删除该软件包。还要注意包名末尾的.

      有关 Jetty 中的类加载过程的更多信息:https://www.eclipse.org/jetty/documentation/9.4.5.v20170502/jetty-classloading.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-30
        • 2022-07-07
        • 2015-05-26
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多