使用IDE运行Spring-boot的主要部分

时间:2015-05-14 12:46:15

标签: java spring maven spring-boot

我有一个需要的弹簧启动应用程序:

  • 可在servlet容器中部署为战争
  • 可以通过`mvn spring-boot:run``
  • 运行

我还希望能够通过右键单击... <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。虽然这是一个可接受的解决方法,但我仍然想知道为什么这不起作用以及是否可以修复。

9 个答案:

答案 0 :(得分:24)

https://youtrack.jetbrains.com/issue/IDEA-140041强烈启发的解决方法是使用测试类路径(包括嵌入式servlet)启动主类。

步骤(IntelliJ 16):

  1. Run - &gt; Edit Configurations - &gt; Add new configuration - &gt;选择Application类型。
  2. Main class设为<your.main.class>
  3. Use classpath of module设置为<*>_test(测试模块!)
  4. OkRun它!

答案 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时遇到相同的问题。我的解决方案是:

  1. 转到Run-> Edit Configurations

  2. 选择Application &&选择当前项目。

  3. 选中Include dependencies with "Provided" scope

  4. OK-> RUN

答案 8 :(得分:0)

请按照以下步骤操作:

  1. 在intellij窗口的右上角,单击下拉菜单并选择“编辑配置”,将打开一个新窗口。

  2. 在此窗口的左上角,单击“ +”按钮,然后选择sprint boot。

enter image description here

  1. 然后添加您的主类和其他详细信息,如屏幕截图所示。 enter image description here

  2. 现在运行该应用程序。