我有一个需要的弹簧启动应用程序:
我还希望能够通过右键单击...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
...
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
并运行它来在我的IDE(Eclipse或IntelliJ IDEA社区)中运行此应用程序。
以下是我的pom.xml的有趣部分(请注意,我不从spring-boot-starter-parent pom继承):
SpringBootServletInitializer
这是我的@Configuration
@EnableAutoConfiguration
@ComponentScan("com.company.theproject")
public class Application extends SpringBootServletInitializer
{
private static final Logger logger = LoggerFactory.getLogger(Application.class);
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(Application.class);
}
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
:
org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.2.3.RELEASE.jar:1.2.3.RELEASE]
... 12 common frames omitted
在IDE中运行main时,我收到以下错误:
mvn spring-boot:run
似乎main
更像是直接运行provided
时不会发生的魔法。
从spring-boot-starter-tomcat
依赖项中删除mvn spring-boot:run
范围修复了此问题,但在servlet容器内运行war时会出现问题。
现在我发现的唯一“修复”是在IntelliJ IDEA中运行mongoexport --fields foo, bar, baz
而不是直接运行main。虽然这是一个可接受的解决方法,但我仍然想知道为什么这不起作用以及是否可以修复。
答案 0 :(得分:24)
从https://youtrack.jetbrains.com/issue/IDEA-140041强烈启发的解决方法是使用测试类路径(包括嵌入式servlet)启动主类。
Run
- &gt; Edit Configurations
- &gt; Add new configuration
- &gt;选择Application
类型。Main class
设为<your.main.class>
Use classpath of module
设置为<*>_test
(测试模块!)Ok
和Run
它!答案 1 :(得分:14)
我认为这可能与https://youtrack.jetbrains.com/issue/IDEA-107048
有关 IntelliJ IDEA没有将provided
依赖项注入到CLASSPATH中,而且Andy声明这就是spring无法创建嵌入式servlet容器的原因。
自2005年以来,他们就此提出了一项功能请求:https://youtrack.jetbrains.com/issue/IDEABKL-99
评论中提到的变通方法包括使用带有必要库的虚假模块并将其用作类路径,使用-Xbootclasspath JVM参数或使用自定义maven配置文件运行(compiled
)vs building({{1} })。
答案 2 :(得分:6)
我能够通过将spring-boot-starter-tomcat依赖项的范围更改为Project structure-&gt; Dependencies选项卡下的“compile”来完成此工作。这不会影响pom.xml,但允许此依赖项可用于spring boot run配置
Click here for image on where to change this setting in idea
答案 3 :(得分:3)
mvn spring-boot:run
在创建类路径时包含provided
个依赖项。听起来像IntelliJ IDEA没有。没有Tomcat在类路径上,Spring Boot无法创建一个嵌入式servlet容器,导致您看到的异常。可以说这是IntelliJ中的一个错误,如果没有容器来提供依赖,那么它确实需要在类路径上。
您可以通过覆盖IntelliJ在运行main方法以包含spring-boot-starter-tomcat
依赖项时使用的默认类路径来解决问题。
答案 4 :(得分:1)
我找到了这个page,并使用maven配置文件来管理配置文件。
<profiles>
<profile>
<id>PROD</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>DEV</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>TEST</scope>
</dependency>
</dependencies>
</profile>
</profiles>
并配置主类beforeLanuce
,设置命令
mvn clean compile -Pdev
答案 5 :(得分:1)
通过将提供的libaray(spring-boot-starter-tomcat)添加到项目配置中,我能够在Intellij IDEA 2017.2中解决这个问题。
选择文件 - &gt;项目结构。选择Libraries并添加一个新项目库(type = From Maven ...)。使用对话框搜索spring-boot-starter-tomcat,选择正确的版本并单击OK添加它。该库将添加到外部库列表中。
缺点是如果更改了Spring Boot版本,那么您必须记住删除此库并添加新版本。
答案 6 :(得分:1)
使用下面的配置文件和说明,您可以向maven添加配置文件,允许在IntelliJ中进行开发,而无需更改其他环境的内容。
<!-- Leave original dependency as-is -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<!-- Enable this profile to run in IntelliJ. IntelliJ excludes provided dependencies from compile by default. -->
<profile>
<id>intellij</id>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
</profiles>
单击IntelliJ右侧的 Maven项目按钮,然后在配置文件下,选择intellij
。
答案 7 :(得分:1)
使用IntelliJ 2018时遇到相同的问题。我的解决方案是:
转到Run
-> Edit Configurations
。
选择Application
&&选择当前项目。
选中Include dependencies with "Provided" scope
。
OK
-> RUN
答案 8 :(得分:0)