【问题标题】:Java Spring Boot - war file not deploying on Tomcat ApacheJava Spring Boot - 未在 Tomcat Apache 上部署的战争文件
【发布时间】:2018-03-23 19:09:03
【问题描述】:

我正在构建一个 Java Spring boot 项目 - 作为要求,我需要将该项目生成为一个 war 文件 - 然后让 Tomcat Apache 单独运行。

我已经构建了 war 文件,但是当我尝试部署它时,它好像结构不正确并且它生成一个 404 试图查看项目。

  • 问题

  • 我的绒球

    http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
    </parent>
    
    <dependencies>
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.0-api -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
        <!-- mysql connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- mail service -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>       
        <!-- hot swapping, disable cache for template, enable live reload -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>provided</scope>
        </dependency>
        <!-- freemarker template -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
        <!-- json simple -->
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>
    
        <!-- tag::actuator[] -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- end::actuator[] -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.194</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

【问题讨论】:

  • 使用您尝试的 404 URL 使用 web.xml 和项目目录结构更新您的问题
  • -- web.xml 似乎丢失了
  • 这是您获得 404 的原因,因为您的应用程序服务器无法映射项目,或者如果您不需要 web.xml 然后stackoverflow.com/questions/37960038/…
  • 一旦你包含了 spring-boot-starter-web 的依赖,Spring 会自动为你添加嵌入式 Tomcat 作为默认的 web 容器。为什么要再次将应用部署到 Tomcat?

标签: java spring maven tomcat war


【解决方案1】:

Java Spring Boot - 未在 Tomcat Apache 上部署战争文件

Spring-Boot 使用 application.jar 构建,内部包含应用服务器。

Spring Boot 旨在让创建 Spring 驱动的、生产级的应用程序和服务变得简单,并且不费吹灰之力。它对 Spring 平台采取固执己见的观点,以便新用户和现有用户可以快速获得他们需要的内容。您可以使用它来创建可以使用“java -jar”或更传统的 WAR 部署启动的独立 Java 应用程序。我们还提供了一个运行“spring 脚本”的命令行工具。

https://spring.io/blog/2013/08/06/spring-boot-simplifying-spring-for-everyone

因此,您无需在 Apache Tomcat 应用服务器中再次部署。 像简单的 java .jar 文件一样运行它。

nohup java -jar app.jar &

【讨论】:

  • 我做不到——他们希望将它打包为一个战争文件——这样它就可以放在安全的医院服务器上。我只使用 maven 构建并运行 jar 文件在本地运行项目,很可能就像您刚刚列出的那样。但他们希望它只处理战争文件以完成部署。
  • Spring 团队创建了 SpringBoot 来解决配置的复杂性。因此,您可以通过删除 pom.xml 依赖项 configure 和 annotation 将其构建为 .war 来删除 SpringBoot 配置,它会正常工作。
  • -- 只需从哪里删除 spring boot 配置? - 我将它构建为一个战争文件 - 它会产生 404 错误
  • 从您的项目 pom.xml 配置依赖项和代码中的 @annotation 以及删除 main 方法。
  • ——我想我解决了 SamDev——不得不重新调整 Application.java “公共类应用程序扩展 SpringBootServletInitializer”
【解决方案2】:

Spring Boot web 项目Spring Boot WebApp as WAR的工作示例

通过 maven 构建的常规 SpringBoot 应用程序是一个打包的 jar。

需要修改为WAR,并检查WEB-INF的内容是否正确。

打包成war的Spring Boot应用不是单独部署到Tomcat中,而是直接通过Spring Boot App运行(通过main方法)。您需要进行测试,但根据我的理解,如果有人建议您将其部署在 tomcat 中,那么您需要通知他们他们要求使用常规的 Web 应用程序而不是 一个 SpringBoot 应用程序。

每个 SpringBoot 应用程序都运行自己的容器。

此外,您将视图文件保存在模板目录中,如果您不使用 Thymeleaf,则无法从模板目录中将它们作为静态内容选取。

【讨论】:

    【解决方案3】:

    根据Traditional deployment page你必须添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      要让 Spring Boot 部署为战争 - 您需要重新配置 Application 类。

      https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html#howto-create-a-deployable-war-file

      @SpringBootApplication
      public class Application extends SpringBootServletInitializer {
      
          @Override
          protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
              return application.sources(Application.class);
          }
      
          public static void main(String[] args) throws Exception {
              SpringApplication.run(Application.class, args);
          }
      
      }
      

      在 pom.xml 中 添加

      <packaging>war</packaging>
      

      在使用 maven 时,我还添加了依赖项。

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
      </dependency>
      

      我的应用程序很复杂,因为我使用 reactjs 作为前端表示层,而 Java 只是作为 api 层。我不得不将 reactjs 构建移动到 main/src/webapps 中——然后这会在 war 文件中正确呈现为 js、css 和 html 文件的捆绑包。使用 reactjs 作为表示层,它只能通过 api 连接到 java 端——所以 url 结构很重要,我已经把所有东西都放在了预期它会从根运行。因此,如果您部署到 tomcat - 您可能需要重命名战争文件 ROOT.war。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-28
        • 2019-03-21
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2017-12-17
        相关资源
        最近更新 更多