我正在使用码头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类加载器将类加载委托给它的父类。但它没有任何帮助。
答案 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>.jar
,jetty-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