【问题标题】:Deploy spring boot application in tomcat在tomcat中部署spring boot应用
【发布时间】:2020-04-17 09:28:13
【问题描述】:

我正在尝试使用 war 文件在 tomcat 9 中部署我的 spring 应用程序,我可以生成 .war 文件但我收到错误 404。 我的应用程序是 SpringBootServletInitializer 的扩展,我覆盖了 configure 方法,我的 pom.xml 文件也有依赖“spring-boot-starter-tomcat”。

日志中没有任何错误。但是,如果我将 index.html 放在我的 webapps 目录中,则 tomcat 会加载它。我需要 tomcat 加载 index.jsp 但它是在 WEB-INF/views 中生成的。

部署目录的树(-L 2):

.
├── META-INF
│   ├── MANIFEST.MF
│   ├── maven
│   └── war-tracker
├── org
│   └── springframework
└── WEB-INF
    ├── classes
    ├── lib
    ├── lib-provided
    └── views

源码结构

.
├── java
│   └── com
│       └── company
│           └── app
│               ├── controller
│               ├── Application.java
│               ├── model
│               ├── service
│               └── util
├── resources
│   └── application.properties
└── webapp
    └── WEB-INF
        └── views
            ├── secondary.jsp
            └── index.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.netexlearning</groupId>
    <artifactId>convalidator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>convalidator</name>
    <description>Spring Boot</description>

    <properties>
        <java.version>11</java.version>
        <start-class>com.company.app.Application</start-class>
        <servlet-api.version>3.1.0</servlet-api.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties:

path.file.service=uploaded
spring.servlet.multipart.max-file-size=2MB
spring.servlet.multipart.max-request-size=2MB
spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp

应用程序.java

@SpringBootApplication
@EnableConfigurationProperties(StorageProperties.class)
public class Application extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    @Bean
    CommandLineRunner init(StorageService storageService) {
        return (args) -> {
            storageService.deleteAll();
            storageService.init();
        };
    }

}

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 你的源码结构是什么样的?
  • 您使用的是哪个 Tomcat 版本和 Spring Boot 版本?
  • 我的 pom.xml 文件也有依赖 "spring-boot-starter-tomcat"... ,应提供注意范围。参考:howto-create-a-deployable-war-file

标签: spring-boot tomcat deployment web-applications


【解决方案1】:

我解决了。

我使用的是存储服务,它需要写入权限,但我不确定在哪里,然后我犯了一个错误:我在 webapps 的已部署文件夹中使用了 chmod 664,Tomcat “运行”我的项目但总是响应是404错误。 Spring 从未执行过任何操作。 我删除了 webapps 中的文件夹,将属性 path.file.service=uploaded 更改为 path.file.service=/tmp/file,然后我再次生成了 war 文件。

现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2019-08-16
    • 1970-01-01
    • 2016-03-28
    • 2015-10-28
    • 1970-01-01
    • 2017-04-01
    相关资源
    最近更新 更多