【问题标题】:Unable to browse to spring boot application using embedded Tomcat无法使用嵌入式 Tomcat 浏览到 Spring Boot 应用程序
【发布时间】:2019-03-13 05:23:49
【问题描述】:

我正在开发一个相当大的 MVC 项目,该项目过去(完美地)只使用 spring MVC 而不是 spring boot 运行。我已经将它转换为 Spring Boot,它在 Netbeans 中完美运行,并且在我的开发机器上作为 Netbeans 之外的独立 JAR 运行时。

我将 JAR 文件传输到其目标服务器,一切都根据控制台正常启动,我收到以下消息:Tomcat started on the port(s): 8081 (HTTP) with context path '/MDHIS'。但是,我无法像在我的机器上使用以下 URL 那样浏览它:http://localhost:8081/MDHIS/

我将 tomcat 设置为调试模式,它记录了一些有趣的事情:

[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.269] o.a.j.s.JspServlet                       
: JspEngine --> /WEB-INF/views/login.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.270] o.a.j.s.JspServlet                       
:        ServletPath: /WEB-INF/views/login.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.270] o.a.j.s.JspServlet                       
:           PathInfo: null
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.272] o.a.j.s.JspServlet                       
:           RealPath: C:\Users\Administrator\AppData\Local\Temp\tomcat- 
docbase.4901819852507265388.8080\WEB-INF\views\login.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.273] o.a.j.s.JspServlet                       
:         RequestURI: /MDHIS/WEB-INF/views/login.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.274] o.a.j.s.JspServlet                       
:        QueryString: null
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.275] o.a.c.c.C.[.[.[.[jsp]                    
:  Disabling the response for further output
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.277] o.a.c.c.C.[.[localhost]                  
: Processing ErrorPage[errorCode=0, location=/error]
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.315] o.a.j.s.JspServlet                       
: JspEngine --> /WEB-INF/views/error.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.315] o.a.j.s.JspServlet                       
:        ServletPath: /WEB-INF/views/error.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.316] o.a.j.s.JspServlet                       
:           PathInfo: null
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.317] o.a.j.s.JspServlet                       
:           RealPath: C:\Users\Administrator\AppData\Local\Temp\tomcat- 
docbase.4901819852507265388.8080\WEB-INF\views\error.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.318] o.a.j.s.JspServlet                       
:         RequestURI: /MDHIS/WEB-INF/views/error.jsp
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.319] o.a.j.s.JspServlet                       
:        QueryString: null
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.319] o.a.c.c.C.[.[.[.[jsp]                    
:  Disabling the response for further output
[WEBCLIENT] [DEBUG] [2018-10-15 14:44:26.320] o.a.c.c.C.[.[.[. 
[dispatcherServlet]      :  Disabling the response for further output

我查看了 docbase 文件夹,并没有向其中添加任何 JSP 或类。我在不同的环境/操作系统/网络上是否有这种工作的混合结果。有人见过这种行为吗?

******编辑******

按要求提供 POM.xml 文件:

共同项目:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mdenis</groupId>
<artifactId>MDHIS_Common</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<dependencies>

    <!--JAVA-->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>

    <!--SPRING-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

    <!--MICROSOFT-->
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
    </dependency>

    <!--HIBERNATE-->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
    </dependency>

    <!--HAPI-->
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-base</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v26</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v25</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v24</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v231</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v23</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v22</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ca.uhn.hapi</groupId>
        <artifactId>hapi-structures-v21</artifactId>
        <version>2.3</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>MDHIS_Common</finalName>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

网络客户端:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.mdenis</groupId>
<artifactId>MDHIS_WebClient</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<packaging>war</packaging>-->

<name>MDHIS_WebClient</name>

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<dependencies>

    <!--JAVA-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.json.bind</groupId>
        <artifactId>javax.json.bind-api</artifactId>
    </dependency> 
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

    <!--GLASSFISH-->
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1.3</version>
    </dependency>

    <!--TOMCAT-->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>

    <!--JASPER REPORTS-->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.7.0</version>
    </dependency>

    <!--SIGAR-->
    <dependency>
        <groupId>org.fusesource</groupId>
        <artifactId>sigar</artifactId>
        <version>1.6.4</version>
    </dependency>

    <!--LOG4J2-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jul</artifactId>
    </dependency>

    <!--YASSON-->
    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>yasson</artifactId>
        <version>1.1.0-SNAPSHOT</version>
    </dependency>

    <!--MDHIS_COMMON-->
    <dependency>
        <groupId>com.mdenis</groupId>
        <artifactId>MDHIS_Common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

</dependencies>

<repositories>

    <repository>
        <id>java.net-Public</id>
        <name>Maven Java Net Snapshots and Releases</name>
        <url>https://maven.java.net/content/groups/public/</url>
    </repository>
    <repository>
        <id>yasson-snapshots</id>
        <name>Yasson Snapshots repository</name>
        <url>https://repo.eclipse.org/content/repositories/yasson-snapshots</url>
    </repository>

</repositories>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

</project>

结论

感谢所有提供帮助的人!尽管它在打包为 JAR 文件时在某些系统上运行良好,但对 WAR 文件的更改是修复它的原因。遗憾的是,我不能再在 Netbeans 中运行该项目,因为它无法识别 Tomcat 服务器嵌入在其自身中,但在以前无法正常工作的 2 个系统(Windows Server 2016 和 Ubuntu LTS 18.04)上使用 java -jar 时,一切正常。

谢谢

【问题讨论】:

  • 什么是“目标服务器”?这通常不是 localhost。
  • 只是我们环境中的一个服务器,SRV2012 和本地 MSSQL 实例。我试图从它本身浏览它,所以它确实是 localhost。我用 IP 地址从另一台机器上尝试过,但也不行。
  • 更新。出于某种原因,在 Ubuntu 18.04 下一切正常。我尝试了其他一些 Windows 虚拟机(Server 2016、2012、Windows 10),所有这些虚拟机都有相同的问题。
  • 但我的开发机器是 Windows 10,它也可以完美运行...
  • 如果这有什么不同,我尝试了 NIO、NIO2 和 APR(使用本地 tomcat 库)。所有 3 在我的 Windows 10 机器和我的 Ubuntu VM 上都可以正常工作,但在其他地方部署时会出现同样的问题。

标签: java spring-boot http-status-code-404 embedded-tomcat-8


【解决方案1】:

面对这样的问题,我会探究本地机器(应用程序运行良好)和服务器(同一个应用程序出现问题)之间的环境差异。我要检查的前几件事如下:

  1. 检查 JSP 是否正在编译到 Tomcat 的工作目录中。
  2. 检查 Tomcat 拾取的 JAVA_HOME 变量。
  3. 检查机器上是否确实安装了 JDK(而不仅仅是 JRE)。
  4. 检查为Tomcat配置的Java版本是否被使用的Spring Boot版本支持。
  5. 检查有效 pom 中具有范围的依赖项 “提供”、“运行时”或“系统”。

但首先,请参考这些JSP Limitations with Spring Boot 并注意您需要使用war 打包——使用可执行jar 时不支持JSP。当使用java -jar 启动时,这个可执行的战争将起作用,并且还可以部署到任何标准容器。

要创建一个战争包装,请在声明工件 ID 的 pom 中包含 &lt;packaging&gt;war&lt;/packaging&gt;

您可能会发现这个Spring Boot JSP sample 很有用。这个another sample 也可能有帮助。

希望上述意见能带来解决方案。

【讨论】:

  • 您的意思是您可以在不使用外部 servlet 容器的情况下将 WAR 文件作为独立的可执行文件运行?我不知道。我也不知道带有嵌入式服务器的 JAR 文件不支持 JSP,甚至从未想过要检查它,因为它实际上在某些地方有效。我想我会尝试一个 WAR 文件。
  • 当我将它打包为一个war文件时,它会尝试使用我在我的PC上安装的tomcat容器,即使我从Netbeans中删除它也是如此。就像它无法识别它实际上是嵌入在应用程序中一样。
  • 你能分享你的pom吗?
  • 我的解决方案实际上由 3 个项目组成:一个公共项目,其中声明了其他 2 个项目使用的所有库(主要是 spring、hibernate 和 Microsoft MSSQL JDBC 驱动程序),一个 Web 客户端(这是我遇到了问题)和独立服务。后者都有自己的依赖项,并且第一个项目作为依赖项带来了我为他们列举的内容。我会尝试将它们添加到我的原始帖子中,但可能太长了。
  • 已添加 POM.xml 文件!
【解决方案2】:

这与其说是一个答案,不如说是一条通往最终成功的道路。我将从一个示例“Spring Boot Embedded Tomcat”项目开始。 Dev Zone has one here. Another example is here. 虽然这些内容太长了,无法在此处包含,但任何其他工作示例也应该没问题。

在当前失败的环境中运行它。

接下来,添加您的详细信息。如果您可以在单独的“块”中执行此操作,那就更好了,因为您可以查看添加的部分会破坏事物。

最后,我回应 Randy 在他的回复中的第一个想法 - 这可能是一个类路径问题。

【讨论】:

    【解决方案3】:

    描述的症状听起来好像 classLoader 没有初始化 SpringBoot 应用程序类。 SpringBoot 首先使用提供的配置启动 Tomcat(这通常总是有效的),然后尝试启动 SpringBoot 应用程序本身。如果 classLoader 失败,接下来会出现“网站无法加载”。

    您可以检查两件事:

    1) 你使用ClassLoader.getSystemClassLoader()吗?不要因为它不支持 SpringBoot 结构(嵌套 jars)。

    2) 您是否在应用程序的任何地方使用java.util.Logging?不要因为它使用ClassLoader.getSystemClassLoader()

    您可以在此处阅读更多信息:https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#executable-jar-restrictions

    我想还有第三个;

    3) 检查依赖的版本兼容性(因为这是 MVC to Boot) https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#appendix-dependency-versions

    祝你好运。

    【讨论】:

    • 我在任何地方都使用 LOG4J2,据我所知,我没有在任何地方使用 ClassLoader。值得一提的是,通过在两台机器上安装 Netbeans 并通过 IDE 运行项目,我已经设法使其在以前无法正常工作的 2 台机器上完美运行。我在机器上使用 Netbeans 构建 jar 文件,当我的机器上生成的 jar 以前无法正常工作时,生成的 jar 也可以在那里完美运行。
    • NB SpringBoot 插件发布说明中很有趣:添加 Spring Boot 依赖项(依赖项元数据取自 Spring Initializr Web 服务)。听起来 NB 正在更新您的依赖项 - 可能来自不同的来源? (你在使用 Nexus 吗?)
    • 这些虚拟机没有互联网访问权限,所以我看不出它们如何更新任何东西。为了让它工作,我上传了最新的 JDK、Netbeans 安装程序和我的整个本地 Maven 存储库。我运行该项目,它运行良好,干净并构建,并且生成的 jar 也可以完美运行。这完全令人费解。
    • 没有奇怪的平台特定要求?似乎只有在你刚才所说的之后它才能跨平台。
    • 我将 sigar.dll 或 sigar.so 文件放在正确的位置,以便 JVM 将其拾取,除此之外,它确实完全独立于平台。由于我已经看到它在 Windows 和 Linux 上都可以工作并且不能工作,所以我几乎排除了操作系统本身。
    猜你喜欢
    • 2017-10-21
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多