Приложение Spring Boot, развернутое в Glassfish, дает странные результаты

Как упоминалось здесь, у меня чертовски много времени ушло на то, чтобы мой небольшой проект Spring-Boot «правильно» развернулся в Glassfish. Он отлично работает со встроенным Tomcat, но как только я пытаюсь переместить его в среду моей организации (Glassfish 3.1.2), я получаю странное поведение.

Думая, что это мой код, я вернулся к проверенному временем подходу «Hello World» и создал супер-базовое приложение, следуя это руководство в блоге Spring.

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

Единственное серьезное отклонение, которое я сделал, заключалось в том, что я обнаружил, что не могу исключить «spring-boot-starter-tomcat» из «spring-boot-starter-web» — когда я попытался это сделать, я получил 2 ошибки в маркерах STS. "-вкладка:

The project was not built since its build path is incomplete. Cannot find the class file for javax.servlet.ServletContext. Fix the build path then try building this project    
The type javax.servlet.ServletContext cannot be resolved. It is indirectly referenced from required .class files    Application.java    

Если я очистил проект STS, а затем запустил Maven Clean, Update, Install the Install, то выдало следующую ошибку:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test: Compilation failure [ERROR] /Users/brandon_utah/Utah Development/sts_workspaces/NidTools Rebooted/test/src/main/java/test/Application.java:[13,8] cannot access javax.servlet.ServletException [ERROR] class file for javax.servlet.ServletException not found

Вместо этого я включил эту зависимость (которую я нашел упомянутой в нескольких других ресурсах SpringBoot):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope>     
</dependency>

В этом случае развертывание на встроенном Tomcat было выполнено нормально, и оно было развернуто на моем Glassfish (локальная установка), но с целой кучей (около полудюжины) ошибок, подобных этой:

2014-04-03T16:23:48.156-0600|SEVERE: Class [ Lorg/springframework/jdbc/datasource/embedded/EmbeddedDatabase; ] not found. Error while loading [ class org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration ]

Большинство из них СЕРЬЕЗНЫ, но я также получаю несколько с ПРЕДУПРЕЖДЕНИЕМ:

2014-04-04T06:57:35.921-0600|WARNING: Error in annotation processing: java.lang.NoClassDefFoundError: org/springframework/batch/core/configuration/annotation/BatchConfigurer

За исключением того, что я нигде в своем проекте не ссылаюсь ни на один из этих отсутствующих классов (кроме того, на что может ссылаться сам Spring Boot).

Кроме того, приложение работает не совсем так, как ожидалось. Если я нажму на RestController, я получу свою страницу, как я и ожидал, но если я добавлю какой-либо оператор System.out или Logger.log в метод контроллера, эта строка кода, по-видимому, никогда не будет выполнена; судя по всему, его просто пропускают.

Чтобы продемонстрировать эту проблему, в RestController моего примера приложения я создал статический счетчик. Затем в методе GET-/ я увеличиваю этот счетчик и значение System.out.println. Я также возвращаю значение как часть ответа.

И снова, с точки зрения пользователя, это работает: на экране отображается «Hello World», а в скобках отображается значение счетчика. Я обновляю окно, счетчик увеличивается. Но ничего в консоли STS. И если я перейду к журналу Glassfish для приложения, там тоже ничего. Ничего такого. Нада. Почтовый индекс Из того, что я могу сказать, что-то таинственным образом поглощает любую попытку что-либо зарегистрировать.

Чтобы добавить к загадке, если я добавлю System.out в SpringBootServletInitializer#configure(), это попадет в консоль. Но если я объявлю конструктор в своем RestController и включу туда System.out, он не попадет в консоль. На всякий случай я даже попытался включить System.err в конструктор и Logger.getAnonymousLogger.severe в метод; ни то, ни другое ни к чему не приводит.

Я должен отметить, что это также развертывается и работает, как и ожидалось, с использованием внешнего Tomcat.

Я был бы очень признателен за любой вклад, так как маловероятно, что я смогу убедить свою организацию развернуть это на Tomcat или использовать подход встроенного Tomcat (из-за политики и подавляющей существующей среды Glassfish).

Мой тестовый проект на Github находится здесь.


person Bane    schedule 04.04.2014    source источник
comment
Как вы запускаете Glassfish и развертываете приложение? Это в STS, в командной строке или в приложении администратора Glassfish?   -  person Dave Syer    schedule 04.04.2014
comment
Если вас это утешит, ваше приложение работает для меня так же, если я развертываю через консоль администратора, но совсем не так, если развертываю через STS. stdout/err — это AWOL, и я предполагаю, что это функция Glassfish. Они должны его проглотить и куда-то положить?   -  person Dave Syer    schedule 04.04.2014
comment
@DaveSyer извините за поздний ответ, был в кемпинге без сигнала. Я пытался использовать все 3 метода (STS, а также командную строку и пользовательский интерфейс Glassfish).   -  person Bane    schedule 07.04.2014
comment
Я ценю подтверждение. Стандартные java-приложения не демонстрируют такого поведения, так что, конечно, это не столько проблема Glassfish, сколько проблема зависимости Spring Boot/jar?   -  person Bane    schedule 07.04.2014
comment
Я отказался от идеи развертывания на GF и вместо этого развертывал на Tomcat. Однако недавние требования заставили меня вернуться к развертыванию в GF. Мне удалось развернуть самые простые приложения в GF4, используя этот ответ SO и этот пример проекта Github   -  person Bane    schedule 19.11.2015
comment
Это было решено здесь - › stackoverflow.com/a/39779634/2777647   -  person Ismael Gimenez    schedule 29.09.2016


Ответы (2)


На это был дан ответ здесь: https://stackoverflow.com/a/29438821/508247

В Glassfish 3.1.X есть ошибка. Вам нужно включить metadata-complete="true" в корневой элемент web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 
     metadata-complete="true"
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
</web-app>
person pmckeown    schedule 04.01.2017
comment
Хороший улов! Я узнал об этом SO-ответе, но не смог обновить этот SO-вопрос со ссылкой на него. Спасибо! - person Bane; 09.02.2017

У меня была такая проблема с Payara 5, я так понимаю проблема стала от Glassfish.

Версии:

  1. Пайара 5.192
  2. Весенняя загрузка 2.1.6

Решение сработало для меня:

Я добавил эту зависимость в pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

Моя конфигурация Glassfish-Web:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC ...>
<glassfish-web-app error-url="">
    <class-loader delegate="true"/>
    <jsp-config>
        <property name="keepgenerated" value="true">
          <description>Keep a copy of the generated servlet class' java code.</description>
        </property>
      </jsp-config>
    <!-- set a friendly context root -->
    <context-root>/micuenta-api</context-root>
    <!-- Change the default character encoding from ISO-8859-1 to UTF-8 -->
    <parameter-encoding default-charset="UTF-8"/>
</glassfish-web-app>
person Milton BO    schedule 18.07.2019