Как развернуть WAR, находящийся внутри EAR, в качестве корневого (/) контекста в Glassfish? - PullRequest
9 голосов
/ 24 сентября 2008

У меня есть файл 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// - обратите внимание на две косые черты.

Что я делаю не так?

Обратите внимание, что файлы WARs sun-web.xml игнорируются, если они содержатся в EAR.

Ответы [ 7 ]

6 голосов
/ 31 августа 2010

В Glassfish 3.0.1 вы можете определить веб-приложение по умолчанию в консоли администрирования: Msgstr "Конфигурация \ Виртуальные серверы \ сервер \ Стандартный веб-модуль". Раскрывающийся список содержит все развернутые военные модули.

Веб-модуль по умолчанию доступен с http://localhost:8080/.

2 голосов
/ 24 сентября 2008

Это похоже на ошибку / особенность.

Вы можете настроить Glassfish на использование определенного веб-приложения в качестве корневого приложения, т.е. когда другой контекст не соответствует, но приложение все еще думает, что оно работает в исходном контексте, а не в корне.

Мое решение состоит в том, чтобы запустить первую WAR в / w и использовать Apache для перенаправления / что угодно / w / что угодно, используя RedirectMatch. Не очень красиво, но это решает проблему (вроде).

RewriteEngine On
RedirectMatch ^/(w[^/].*) /w/$1
RedirectMatch ^/([^w].*) /w/$1
2 голосов
/ 24 сентября 2008

Это мне кажется ошибкой на сервере приложений glassfish. Он должен работать так, как уже определен ваш файл application.xml.

Может быть, вы могли бы попробовать следующее:

<context-root>ROOT</context-root>
1 голос
/ 08 апреля 2013

То же решение, что описано через @jiriki и @SteveGreenslade, но через asadmin Найдено по: http://www.java.net/node/681176

Или вы можете использовать CLI для изменения этого веб-модуля по умолчанию.

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;

однако я не проверял эту опцию

1 голос
/ 22 октября 2010

Спасибо, Джирики. Идеальный ответ! Работает в Galssfish 2.1.1 тоже!

Конфигурация> Служба HTTP> Виртуальные серверы> Сервер

или изменить default-web-module параметр в domain.xml

0 голосов
/ 26 июня 2010

Вы уже попробовали более свежую версию Glassfish? (3.0.1 только что вышел).

Мне удалось получить единую WAR в разорванном EAR для развертывания на http://localhost/ с использованием Glassfish 3.0.1. Как вы упомянули, sun-web.xml, похоже, игнорируется (по крайней мере, внутри взорвавшихся ушей).

0 голосов
/ 24 сентября 2008

http://localhost:8080// должен быть действительным URL-адресом, эквивалентным http://localhost:8080/

Я бы поэкспериментировал, оставив пустым контекстный корень war1 (хотя я не уверен, разрешено ли это). Или изменив его на <context-root>.</context-root>.

В противном случае я бы сказал, что сгенерированный URI является ошибкой со стороны Glassfish, поскольку я никогда не видел этого с использованием sun.

...