当前位置: 首页 > 知识库问答 >
问题:

使用IDE运行springboot的main

金瑞
2023-03-14

我有一个Spring启动应用程序,需要:

  • 可以在servlet容器中作为战争部署
  • 通过“mvn Spring Boot:运行”可运行``

我还希望通过右键单击main并运行它,能够在我的IDE(Eclipse或IntelliJ IDEA社区)中运行此应用程序。

下面是我的pom.xml的有趣部分(注意,我不是从spring boot starter父pom继承的):

...
        <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>

这是我的SpringBootServletilizer

@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);
    }
}

在IDE中运行main时,我会遇到以下错误:

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

看起来像是mvn spring boot:run执行了一些直接运行main时不会发生的魔法。

spring boot starter tomcat依赖项中删除提供的作用域可以修复此问题,但在servlet容器中运行war时会导致问题。

现在我发现唯一的“修复”方法是在IntellijIDEA中运行MVNSpringBoot:run,而不是直接运行main。虽然这是一个可以接受的解决方法,但我仍然想知道为什么它不起作用,以及它是否可以被修复。


共有3个答案

茅和玉
2023-03-14

通过将SpringBootStarter tomcat依赖项的范围更改为项目结构下的“编译”,我能够做到这一点-

单击此处查看有关在idea中更改此设置的位置的图像

韶浩皛
2023-03-14

我相信这可能与https://youtrack.jetbrains.com/issue/IDEA-107048

IntelliJ IDEA没有将提供的依赖项注入到CLASSPATH中,正如Andy所说,这就是Spring无法创建嵌入式servlet容器的原因。

自2005年以来,他们提出了一项功能要求:https://youtrack.jetbrains.com/issue/IDEABKL-99

注释中提到的解决方法包括使用带有必要libs的假模块并将其用作类路径,使用-Xbootclasspath JVM参数或使用自定义maven配置文件来运行(编译的)和构建(提供的)。

徐涵亮
2023-03-14

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

  1. 运行-
 类似资料:
  • 问题内容: 我有一个Spring Boot应用程序,需要: 可作为战争部署在servlet容器中 可通过运行 我还希望能够通过右键单击main并运行它在IDE(Eclipse或IntelliJ IDEA社区)中运行此应用程序。 这是我pom.xml有趣的部分(请注意,我不是从spring-boot-starter-parent pom继承的): 这是我的 在IDE中运行main时,出现以下错误:

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 19.1 从IDE运行 您可以从IDE将Spring Boot应用作为一个普通的Java程序来运行,不过,首先需要导入您的项目。导入步骤将根据您的IDE和构建系统而有所不同。大多数IDE可以直接导入Maven项目,例如Eclipse用户可以从File菜单中选择Import…→Existing Maven Projects。 如果您无法将项目直接导入到IDE中,您可以使用构建插件生成IDE元数据。M

  • 我有以下测试: 这是好的,它可以运行,但是我想知道有没有一种方法可以将它作为单元测试而不是集成测试运行,并且仍然使用@mockbean@autowired。还是我错过了什么? 我试着只保留@ExtendWith(SpringExtension.class),但我得到一个关于找不到BookServiceImpl bean的异常。 我知道如何使用MockitoExtension和@mock、@inje

  • 各位工程师,大家好! 我在试图创建一个胖罐子来执行cucumber测试时遇到了一个问题。最初,我按照指南从Baeldung设置测试。当在Maven测试阶段执行时,测试运行良好。当运行带有参数的mvn exec:java命令时,它也能正常工作。 然而,当我创建了一个胖罐子并试图执行测试时,我面临着错误 以下是我的项目的解释,它基本上与Baeldung的测试项目完全一样。 项目结构 直接从可执行jar