【问题标题】:How do you deploy a WAR that's inside an EAR as the root (/) context in Glassfish?如何将 EAR 中的 WAR 部署为 Glassfish 中的根 (/) 上下文?
【发布时间】:2010-09-12 18:03:37
【问题描述】:

我有一个 EAR 文件,其中包含两个 WAR,war1.war 和 war2.war。我的 application.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<application version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd">
  <display-name>MyEAR</display-name>
  <module>
    <web>
      <web-uri>war1.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>war2.war</web-uri>
      <context-root>/war2location</context-root>
    </web>
  </module>
</application>

这导致war2.war 在http://localhost:8080/war2location 上可用,这是正确的,但war1.war 在http://localhost:8080// 上可用——注意两个斜线。

我做错了什么?

请注意,WAR 的 sun-web.xml 文件在包含在 EAR 中时会被忽略。

【问题讨论】:

    标签: jakarta-ee glassfish ear


    【解决方案1】:

    通过@jiriki 和@SteveGreenslade 描述的相同解决方案,但通过asadmin。 发现于:http://www.java.net/node/681176

    或者您可以使用 CLI 更改此默认 Web 模块。

    asadmin get server.http-service.virtual-server.server.default-web-module
    

    应该向您展示该应用程序,然后您可以使用 asadmin set 命令对其进行更改。

    更新(Glassfish 3.1+): 使用 glassfish 3.1+,您无需设置 default-web-module 即可实现它。唯一需要修改的地方是

    <your_ear>.ear/META-INF/application.xml
    

    你应该在哪里放置你的网络模块:

    <context-root/>
    

    这样就可以了。

    根据此处提供的其他答案,我有一个错误的印象,需要更多的东西。看混淆引起的相关问题:http://www.java.net/forum/topic/glassfish/glassfish/asadmin-restart-domain-not-working-war-inside-ear-default-web-module

    基本上:

    <context-root>/</context-root>
    

    应该也可以,基于代码 (https://svn.java.net/svn/glassfish~svn/tags/3.1.2/web/web-glue/src/main/java/com/sun/enterprise/web/WebContainer.java):

        if (wmContextPath.length() == 0)
            displayContextPath = "/";
        else
            displayContextPath = wmContextPath;
    

    但是我没有测试这个选项

    【讨论】:

      【解决方案2】:

      谢谢jiriki。完美答案! 也适用于 Galssfish 2.1.1!

      配置> HTTP 服务> 虚拟服务器> 服务器

      或更改domain.xml中的default-web-module参数

      【讨论】:

        【解决方案3】:

        在 Glassfish 3.0.1 中,您可以在管理控制台中定义默认 Web 应用程序: “配置\虚拟服务器\服务器\默认 Web 模块”。 下拉框包含所有部署的战争模块。

        然后可以从http://localhost:8080/ 访问默认网络模块。

        【讨论】:

          【解决方案4】:

          您是否在更新版本的 Glassfish 上再次尝试过? (3.0.1刚出来)。

          我已经能够使用 Glassfish 3.0.1 在爆炸的 EAR 中获得 -single- WAR 以部署到 http://localhost/。就像你提到的,sun-web.xml 似乎被忽略了(至少在爆炸的耳朵内)。

          【讨论】:

            【解决方案5】:

            这似乎是一个错误/功能。

            您可以将 Glassfish 设置为使用某个 Web 应用程序作为根应用程序,即。当没有其他上下文匹配时,应用程序仍然认为它在原始上下文而不是根上运行。

            我的解决方案是在 /w 上运行第一个 WAR,并使用 Apache 使用 RedirectMatch 将 /whatever 重定向到 /w/whatever。不是很漂亮,但它解决了问题(有点)。

            RewriteEngine On
            RedirectMatch ^/(w[^/].*) /w/$1
            RedirectMatch ^/([^w].*) /w/$1
            

            【讨论】:

              【解决方案6】:

              这在我看来是 glassfish 应用程序服务器中的一个错误。 它应该可以工作,因为它已经定义了您的 application.xml 文件。

              也许您可以尝试以下方法:

              <context-root>ROOT</context-root>
              

              【讨论】:

              • 试过了; /ROOT 上可用的 WAR :)
              【解决方案7】:

              http://localhost:8080// 仍应是等效于 http://localhost:8080/ 的有效 URL

              我会尝试将 war1 的上下文根留空(尽管我不确定这是否允许)。或将其更改为&lt;context-root&gt;.&lt;/context-root&gt;

              否则我不得不说生成的 URI 是 glassfish 的一个错误,因为我从未见过使用 sun 的。

              【讨论】:

              • 这并不不幸。 localhost:8080 提供 Glassfish 的默认欢迎屏幕。空的上下文根使用 WAR 名称和 .根本行不通。 :(
              猜你喜欢
              • 2011-12-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-29
              • 1970-01-01
              相关资源
              最近更新 更多