如何删除 Jetty webapp url 的根元素?

lau*_*ura 5 java url jetty maven

我正在运行一个 Java webapp(我们称之为 mywebapp)。

目前,我通过在本地指向以下内容来访问我在此 webapp 中的页面:

http://localhost:9000/mywebapp/mystuff
Run Code Online (Sandbox Code Playgroud)

但是,我需要使用以下方法访问它:

http://localhost:9000/mystuff
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我试过搞乱一些 confs,但无济于事......

这是我当前的 root.xml:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="contextPath">/root</Set>
    <Set name="war">
        <SystemProperty name="app.webapps.path"/>/mywebapp.war
    </Set>
</Configure>
Run Code Online (Sandbox Code Playgroud)

还试过:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="contextPath">/</Set>
    <Set name="war">
        <SystemProperty name="app.webapps.path"/>/mywebapp.war
    </Set>
</Configure>
Run Code Online (Sandbox Code Playgroud)

我正在使用 Maven - 不确定这是否会有所作为。

谢谢!

Joa*_*elt 5

为了将您的上下文路径设置为"/"您需要使用上下文部署。注意:出于路径规范映射的原因,您必须指定上下文路径字符串。空上下文路径字符串""仅作为从请求到上下文根的映射结果有效。请参阅 servlet 规范的第 12.2 节)

在 Jetty 7.x 中,上下文路径分配由分配给 DeploymentManager 的 AppProviders 处理。

默认情况下,在码头分布,两者的WebAppProvider和ContextProvider被启用。稍后了解这一点很重要,因为它会影响您决定将 mywebapp.war 文件放在哪里。

查看该${jetty.home}/start.ini文件,您将看到它包含对etc/jetty-webapps.xmletc/jetty-contexts.xml

WebAppProvider 的作用是关注${jetty.home}/webapps/任何可部署应用程序(例如 *.war)的目录,并将它们部署到与文件名同名的上下文中。换句话说${jetty.home}/webapps/MyApp-2.4.war就是部署到上下文中"/MyApp-2.4"。还有一个特殊的“root.war”保留字将部署到上下文中"/"。虽然这是最简单的部署机制,但它牺牲了对部署细节的控制。

ContextProvider 的作用是关注${jetty.home}/contexts/任何 jetty-xml 格式的可部署上下文的目录。这种部署机制让你对部署有最大的控制权,xml文件可以控制任何最终解析为org.eclipse.jetty.server.handler.ContextHandler基类的东西,其中WebAppContext (wars / servlets / etc) 是其中的一部分的。最常见的用途是指定一个基于 WebAppContext 的 xml 文件,并控制诸如构成 Web 应用程序的文件和目录、要使用的临时目录,甚至要使用的 Context Path 等内容。

你要做的是:

  1. 确保在 start.ini 中启用了基于 ContextProvider 的部署(确保etc/jetty-context.xml存在)
  2. 创建一个${jetty.home}/contexts/mywebapp.xml声明<Set name="contextPath">/</Set>选项。
  3. 如果您etc/jetty-webapps.xml的 start.ini 中有存在,请不要将 mywebapp.war 放入,${jetty.home}/webapps因为这会导致 WebAppProvider 也部署相同的 web 应用程序并混淆您的部署。

最后,您可以在jetty 发行版本身中看到这是如何完成的,只需打开${jetty.home}/contexts/test.xml并环顾四周即可。您将看到它${jetty.home}/webapps/test.war通过 ContextProvider 的使用将 加载${jetty.home}/contexts/test.xml"/"上下文路径中。

另一个注意事项,查看日志。

2012-01-13 13:56:28.779:INFO:oejsh.ContextHandler:started oejwWebAppContext{/,file:/tmp/jetty-0.0.0.0-8080-test.war-_-any-/webapp/},/home /joakim/code/jetty/distros/jetty-distribution-7.6.0.RC3/webapps/test.war

这告诉我 WebAppContext 是

  • 开始于{/,(根上下文路径)
  • 使用临时/工作目录 file:/tmp/jetty-0.0.0.0-8080-test.war-_-any-/webapp/
  • 使用 中指定的 Web 应用程序/home/joakim/code/jetty/distros/jetty-distribution-7.6.0.RC3/webapps/test.war

更新:澄清有关空上下文路径的声明。