![](/img/trans.png)
[英]Spring Boot maven project from Eclipse doesn't work in Intellij
[英]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.