部署到Glassfish的Spring Boot应用程序给出了奇怪的结果

时间:2014-04-04 13:40:25

标签: glassfish-3 spring-boot spring-tool-suite

正如前面提到的here,我有一点时间让我的小型Spring-Boot项目“正确”部署到Glassfish。它使用嵌入式Tomcat运行良好,但是一旦我尝试将其移动到我的组织环境(Glassfish 3.1.2)中,我就会遇到一些奇怪的行为。

认为这是我的代码,我回到了经过时间考验的“Hello World” - 方法,并在this tutorial on Spring's blog之后构建了一个超级基本的应用程序。

我确实做了一些非常小的偏差,但是根本没有任何应该影响这个应用程序的东西。

我唯一的主要偏差是我发现我无法从“spring-boot-starter-web”中排除“spring-boot-starter-tomcat” - 当我尝试这样做时,我遇到了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,更新,安装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环境)。

My test project on Github is here

2 个答案:

答案 0 :(得分:2)

这已在此处回答:https://stackoverflow.com/a/29438821/508247

Glassfish 3.1.X中存在错误。您需要在web.xml根元素中包含metadata-complete="true"

<?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>

答案 1 :(得分:0)

我在Payara 5上遇到了这个问题,我了解到问题出自Glassfish。

版本:

  1. Payara 5.192
  2. Spring Boot 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网站配置:

<?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>