Как упоминалось здесь, у меня чертовски много времени ушло на то, чтобы мой небольшой проект 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).