【问题标题】:Spring runs fine on server but not main applicationSpring 在服务器上运行良好,但在主应用程序上运行良好
【发布时间】:2020-08-21 19:45:33
【问题描述】:

我正在尝试创建一个新的 Spring MVC Web 应用程序项目 (MVN)。我完成了整个设置,并且可以通过带有 Eclipse 的 Tomcat “在服务器上运行”。端点都工作。我可以看到我的 jsp 页面。

另一方面,如果我尝试运行我的主应用程序 (SpringApplication.run()),它将无法正常工作。我在每个页面上都收到 404。

@SpringBootApplication
public class App extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(App.class,  args);
    }   
}

为什么如果我运行这个驱动程序类(而不是选择我的文件夹并在服务器上运行它)我无法查看任何页面并且只能看到 404 白标错误页面?我该如何解决这个问题?

编辑:看来我的项目设置可能很糟糕。我认为它可能来自创建一个 Maven 项目、转换为动态 Web 项目以及我的依赖项。最终使用 Spring.io 而不是自己尝试配置它,一切正常。

【问题讨论】:

  • 欢迎来到 StackOverflow!你的主类和控制器的包名是什么?
  • 谢谢!包是 com.test,控制器在 com.test.controller。
  • 请注意,如果您正在创建一个新应用程序,高度建议完全跳过“在服务器上运行”和外部容器; main 的简单性正是 Boot 团队不厌其烦地为嵌入式服务器编写代码的原因。
  • 我明白了。我不想“在服务器上运行”,这是 Udemy 课程所展示的方式。除其他外,运行/测试很烦人。即使在我的工作中,我们也将生产应用程序部署为 jars 并在容器中运行它们,因此尝试学习一种我在工作中没有使用的方法对我来说没有多大意义。

标签: java spring eclipse tomcat model-view-controller


【解决方案1】:

如果它是一个 Maven 项目,请检查您的 Pom.xml。

 <groupId>com.spring.demo</groupId>
 <artifactId>springdemo</artifactId>
 <version>1.0</version>
 <packaging>war</packaging>

尝试删除包装标签或将 War 更改为 Jar。以便您可以通过主应用程序运行项目。

【讨论】:

  • 感谢您的回复。问题不在于作为应用程序运行。问题是当它作为应用程序运行时——我只得到 404 白标错误页面。它没有检测到我的 index.jsp。没有。另一方面,通过服务器运行它会很好地显示我的索引和页面。
【解决方案2】:

您当前的配置是在服务器上运行(扩展 SpringBootServletInitializer)。根据您使用的项目管理工具(Maven、Gradle),此配置应在编译后创建应该在应用程序服务器(或 servlet 容器,取决于您的依赖项)上运行的 WAR 文件。

如果你希望从命令行运行你的 spring 应用程序,删除 ServletInitializer 并使用 spring boot tomcat 依赖项(spring-boot-starter-web 已经包含它)你的应用程序应该编译为 JAR 文件(同样你需要在您的项目管理工具)并且应该使用嵌入式 tomcat servlet 容器运行,因此可以使用 java -jar 命令从命令行运行。请提供更多信息(依赖项和配置),因为您的问题并不完全清楚您要实现的目标。

编辑! 在下面评论部分
主类:

    @SpringBootApplication
    public class ApplicationLauncher {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationLauncher.class, args);
    }

    @RestController
    public class Root {
        @GetMapping("/")
        public ResponseEntity root() { return ResponseEntity.ok().build(); }
    }
}

POM 文件:

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

    <parent> <!-- main spring boot dependency -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>temp2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <!-- global versions -->
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.build.resourceEncoding>UTF-8</project.build.resourceEncoding>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>application</finalName>
        <plugins>
            <plugin> <!-- plugin to create über WAR file containing all dependencies -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

您可以使用“mvn clean install”进行编译,然后在目标文件夹中您将找到可以从命令行运行的 JAR 文件。

【讨论】:

  • 我的印象是 Web 应用程序需要“SpringBootServletInitializer”。我的问题是,如何将 Spring 作为应用程序运行,而不是“作为服务器运行”(这将是部署的 WAR) 如前所述,如果我“作为服务器运行”,那么一切正常。我的测试页工作。如果我尝试将它作为应用程序运行,则 tomcat 会启动,但我在每个页面上都点击了 404 白色标签。如何让它作为应用程序正常运行?
  • 确实如此,但前提是您将应用程序部署到 servlet 容器(或应用程序服务器,它是 servletcontainer 的“超集”)。因为当作为 JAR 运行时,您正在部署到嵌入式 servlet 容器,该容器的行为不同并且不需要初始化 servlet 上下文。我将使用 Maven 项目的简约配置来编辑我的答案。
  • 我明白了。然而,删除继承并没有什么不同。我仍然遇到 404 白标错误页面。我只是很困惑和不安。它如何在服务器上运行 100% 正常,但当我使用 SpringApplication.run() 运行主类时却不行?这在我的脑海中毫无意义。
  • 我仍然不确定问题出在哪里,但是使用 Spring.io 应该是我的第一步,在为 Spring.io 创建测试版本后,我可以正常运行他们的测试应用程序。我认为问题出在项目属性中。我做了一个 maven 项目,然后将其转换为动态 Web 项目。我确保使用相同的部署程序集配置。它必须是项目的设置方式。吸取教训,从现在开始使用 Spring.io。
猜你喜欢
  • 1970-01-01
  • 2020-02-25
  • 2013-06-08
  • 2017-06-16
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多