如何在EAR中部署一个WAR作为Glassfish中的根(/)上下文?

时间:2008-09-24 14:23:38

标签: java-ee glassfish ear

我有一个包含两个WAR的EAR文件,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// 上 - 注意两条斜线。

我做错了什么?

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

7 个答案:

答案 0 :(得分:6)

在Glassfish 3.0.1中,您可以在管理控制台中定义默认Web应用程序: “Configuration \ Virtual Servers \ server \ Default Web Module”。 下拉框包含所有已部署的war模块。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

结构&gt; HTTP服务&gt;虚拟服务器&gt;服务器

或更改default-web-module

中的domain.xml参数

答案 4 :(得分: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;

但是我没有测试这个选项

答案 5 :(得分:0)

http://localhost:8080//仍应是相当于http://localhost:8080/

的有效网址

我试着将war1的context-root留空(虽然我不确定是否允许)。或者将其更改为<context-root>.</context-root>

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

答案 6 :(得分:0)

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

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