如何在GlassFish中将EAR内部的WAR部署为根(/)上下文?

问题描述:

我有一个EAR文件,其中包含两个WAR,war1.war和war2.war。我application.xml文件看起来是这样的:如何在GlassFish中将EAR内部的WAR部署为根(/)上下文?

<?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中时,WARs的sun-web.xml文件会被忽略。

http://localhost:8080//仍然应该是相当于​​

我同意离开WAR1空白的上下文根实验(虽然我不知道这是允许的)一个有效的URL。或将其更改为<context-root>.</context-root>

否则我不得不说,生成的URI是玻璃鱼的一部分,因为我从来没有见过使用太阳的错误。

+1

这不是不幸的。 http:// localhost:8080 /给出Glassfish的默认欢迎srceen。一个空的上下文根使用WAR名和a。根本不起作用。 :( – 2008-09-24 14:38:27

这在我看来是glassfish应用服务器中的一个bug。 它应该像它已经定义你的application.xml文件一样工作。

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

<context-root>ROOT</context-root> 
+3

试过了; WAR上/ ROOT :) – 2008-09-24 15:15:58

这似乎是一个bug /功能。

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

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

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

你给了它更多的最新版本的Glassfish吗? (3.0.1刚刚出来)。

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

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

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

谢谢jiriki。完美的答案! 也可以在Galssfish 2.1.1中使用!

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

或经由@jiriki和@SteveGreenslade描述改变domain.xml

相同的溶液default-web-module参数,但通过asadmin的。 找到:http://www.java.net/node/681176

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

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

应该表现出你的应用程序,然后你可以使用的asadmin set命令来改变它。

UPDATE(Glassfish的3.1+): 在GlassFish 3.1+,你可以实现它无需任何设置默认网络模块。您需要修改的地方是

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

,你应该把你的Web模块:

<context-root/> 

,没有工作。

根据其他答案,我在这里得到了一个错误的印象,需要更多的东西。见引起混乱相关的问题:

<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):http://www.java.net/forum/topic/glassfish/glassfish/asadmin-restart-domain-not-working-war-inside-ear-default-web-module

基本上

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

但是我没有测试这个选项