如何允许Web应用程序使用jetty服务器类?

时间:2014-03-12 14:37:45

标签: jetty

我正在使用码头9。 我需要在我的Web应用程序中使用一个位于jetty服务器库中的类,例如org.eclipse.jetty.servlet.ServletContextHandler。当jetty启动时,它在类路径中包含它的libs。但是当我尝试从我的网络应用程序中使用它时,我发现类没有发现异常。我猜WEB-INF / lib类和jetty服务器类是由不同的类加载器加载的。所以我在etc / jetty-deploy.xml中加入了WebAppProvider

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

希望webapp类加载器将类加载委托给它的父类。但它没有任何帮助。

2 个答案:

答案 0 :(得分:3)

我正在使用jetty 8.我在webapp jetty-web.xml中设置参数:

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

然而,参数本身是不够的,因为org.eclipse.jetty.webapp.WebAppClassLoader避免了“系统”和“服务器”类,请参阅jetty classloading doc。因此,为了允许例如来自org.eclipse.jetty.util的服务器类,您需要告诉您的网络应用程序,例如通过

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

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

答案 1 :(得分:0)

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

我的码头版本:9.4.5.v20170502。

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

当试图让事情发挥作用时,我们有时会改变服务器的内部配置,希望它会有所作为。虽然我认为可以在服务器级别设置此配置,但我强烈反对它,因为它使您的应用程序无法在不同的Jetty服务器上移植。

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

这意味着将您需要的jetty-server-<version>.jarjetty-servlets-<version>.jar和任何其他jetty-<something>-<version>.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