簡體   English   中英

使用Spring Boot的Spring MVC不能與Eclipse的Tomcat服務器一起使用

[英]Spring MVC with Spring Boot doesn't work with the Tomcat server of Eclipse

我嘗試遵循Spring入門指南“使用Spring MVC提供Web內容”,除了Maven之外還使用Spring Boot和Gradle。 我將Gradle插件安裝到Eclipse。

我想在Eclipse中使用Tomcat服務器運行應用程序,因為我還遵循“將Spring Boot JAR應用程序轉換為WAR”指南並更改了指南中提到的“build.gradle”文件。 基本上,我添加了行“apply plugin:'eclipse-wtp'”,“apply plugin:'war'”,configurations {providedRuntime}和providedRuntime(“org.springframework.boot:spring-boot-starter-tomcat”); 並將jar設置更改為war設置。 這是build.gradle文件:

buildscript {
repositories {
    maven { url "http://repo.spring.io/libs-milestone" }
    mavenLocal()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.2.RELEASE")
}
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'war'

eclipse.project {
  natures 'org.springsource.ide.eclipse.gradle.core.nature'
}

war {
    baseName = 'gs-serving-web-content'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-milestone" }
}

configurations {
    providedRuntime
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    testCompile("junit:junit")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

我還提到了HelloWebXml類。 這是班級:

package hello;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class HelloWebXml extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

除了這些,我需要更改pom.xml,因為它抱怨Java SE 7的功能。 在pom.xml中添加了以下行:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
            <showWarnings>true</showWarnings>
            <compilerVersion>1.7</compilerVersion>
            <fork>true</fork>
        </configuration>
</plugin>

其余部分與入門指南相同。

對於建築,我跑

gradlew eclipseWtp
gradlew clean build

命令。 在此之后,war文件在項目的build / libs文件夾中創建。 如果我將war文件復制到我的本地Tomcat服務器並啟動服務器,一切都按預期工作。

如果我將項目拖到服務器選項卡下的Tomcat服務器(使用相同的本地Tomcat創建)並運行服務器,則會拋出ClassCastException並出現投訴:“ 無法將org.springframework.web.SpringServletContainerInitializer強制轉換為javax.servlet .ServletContainerInitializer “。

我在兩個部署位置檢查了項目的文件夾結構。 在本地(非Eclipse)部署位置,服務器啟動后,將按預期創建具有war文件名稱的文件夾。 在WEB-INF文件夾中,有一個lib提供的目錄。 我檢查了Eclipse的Tomcat的部署位置,它沒有包含名為lib-provided的目錄。 我想問題是這個目錄沒有被創建,但我找不到解決方案。

我已經在使用Spring MVC了,我知道如何使用web.xml創建MVC項目,但我是Spring Boot的新手。 Eclipse的Tomcat服務器運行我之前的Spring MVC項目。 所以問題在於Spring Boot項目。

我檢查了幾個相關問題,但它們和我的不一樣。 我無法找到解決問題的方法。

我在這里錯過了什么?

提前致謝。

我想你正在與servlet-api JARs發生沖突。 如果使用嵌入式Tomcat(創建JAR)進行開發,則需要在compile范圍的類路徑中包含servlet-api JAR。 在部署到現有Tomcat安裝(創建WAR)時,必須在provided范圍內聲明servlet-api jar,否則它將最終出現在web-inf/lib並導致與容器提供的版本沖突。

以下是示例Spring Boot WAR項目中的POM: https//github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-traditional/pom.xml

注意spring-boot-starter-tomcat使用provided范圍。

Spring Boot進行了一些特殊處理,以允許可嵌入或在容器中運行的可執行WAR。 必須特別注意provided范圍中的依賴關系,因為這些可能與容器沖突。 有關詳細信息,請參閱Spring Boot參考指南 通過構建的WAR而不是通過Eclipse部署時,構建工作的原因是Eclipse WTP實際上並不使用Maven來執行構建,因此Maven構建和WTP構建將不完全匹配。

我正在努力解決同樣的問題。 我打算做的是專門為此目的創建一個單獨的'dev'maven模塊,並使用標簽將provided條目(某些)切換到runtime

@meribald你可以在那個配置你的pom.xml:

  <profiles>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <packaging-profile>jar</packaging-profile>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <packaging-profile>war</packaging-profile>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

在你的pom.xml的頂部

<packaging>${packaging-profile}</packaging>

因此,在開發時,將應用程序作為Java應用程序運行,maven將生成一個jar文件。 如果要打包war文件以在服務器上部署,則可以在maven命令行上運行

mvn -Pprod package

或者在Eclipse中運行>> Maven Build ...,並在目標字段上放置“package”,在profiles字段上放置“prod”(不帶引號)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM