Приложение 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 для приложения, там тоже ничего не появится. Ничего такого. Нада. Zip. Из того, что я могу сказать, что-то таинственно поглощает любую попытку что-либо записать.
Чтобы добавить к загадке, если я добавлю System.out в SpringBootServletInitializer#configure(), это сделает его на консоли. Но если я объявлю конструктор в своем RestController и включу System.out там, то он не попадет в консоль. В качестве примера я даже попытался включить System.err в конструктор и Logger.getAnonymousLogger.severe в метод; ни один из этих результатов ни к чему не приводит.
Должен отметить, что он также развертывается и работает, как и ожидалось, с использованием внешнего Tomcat.
Я был бы очень признателен за любой вклад, поскольку маловероятно, что я смогу убедить мою организацию развернуть это в Tomcat или использовать подход встроенного Tomcat (из-за политики и подавляющей существующей среды Glassfish).
1 ответ
На этот вопрос ответили здесь: /questions/19845564/prilozhenie-spring-boot-ne-razvertyivaetsya-na-glassfish-41/19845581#19845581
В 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>
У меня была такая проблема с Payara 5, я так понимаю проблема стала от Glassfish.
Версии:
- Payara 5.192
- Весенняя загрузка 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>