[java] IDEを使用してSpringブートのmainを実行する


Answers

youtrack.jetbrains.com/issue/IDEA-140041から強く影響を受けた回避策は、テストクラスパス(組み込みサーブレットを含む)でメインクラスを開始することです。

ステップ(IntelliJ 16):

  1. Run - > Edit Configurations - > Add new configuration - > Application種類の選択を選択しApplication
  2. Main class<your.main.class>設定し<your.main.class>
  3. Use classpath of module<*>_test設定Use classpath of module (テストモジュール!)
  4. OkRunてください!
Question

私はスプリング・ブート・アプリケーションが必要です:

  • サーブレットコンテナに戦争として展開可能
  • `mvn spring-boot:run``で実行可能です。

また、IDE(EclipseまたはIntelliJ IDEA Community)でmainアプリケーションを右クリックして実行すると、このアプリケーションを実行できます。

ここに私のpom.xmlの興味深い部分があります(私はspring-boot-starter-parent 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>

ここに私の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);
    }
}

IDEの内部でメインを実行すると、次のエラーが発生します。

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直接実行しているときに起こらないいくつかの魔法をmvn spring-boot:runmvn spring-boot:run

spring-boot-starter-tomcat依存関係から指定providedスコープを削除すると、この問題は修正されますが、WARがサーブレットコンテナ内で実行されるときに問題が発生します。

現在私が見つけた唯一の "修正"はmvn spring-boot:runを実行することですmvn spring-boot:runメインを直接実行する代わりにIntelliJ IDEA内で実行してください。 これは許容可能な回避策ですが、なぜこれが機能しないのか、また修正できるのかを知りたいと思います。




mvn spring-boot:runは、クラスパスの作成時にprovided依存関係を含みmvn spring-boot:run 。 IntelliJ IDEAのようには聞こえません。 クラスパスにTomcatがなければ、SpringBootはあなたが見ている例外を引き起こす埋め込みサーブレットコンテナを作成できません。 おそらくこれはIntelliJのバグです。依存関係を提供するコンテナがない場合、クラスパス上にある必要があります。

IntelliJがmain spring-boot-starter-tomcat methodを実行してspring-boot-starter-tomcat依存関係をインクルードするときに使用するデフォルトのクラスパスを上書きすることで、この問題を解決できる場合があります。




私はIntellij IDEA 2017.2でこの問題を回避するために、提供されたlibaray(spring-boot-starter-tomcat)をプロジェクト構成に追加しました。

「ファイル」 - >「プロジェクト構造」を選択します。 ライブラリを選択し、新しいプロジェクトライブラリを追加します(type = From Maven ...)。 ダイアログを使用してspring-boot-starter-tomcatを検索し、正しいバージョンを選択してOKをクリックして追加します。 ライブラリが外部ライブラリのリストに追加されます。

欠点は、Springブートバージョンが変更された場合、このライブラリを削除して新しいバージョンを追加することを忘れないでください。




私はIntelliJ 2018を使用して同じ問題を抱えていました。私の解決策は次のとおりです。

  1. Run - > Edit Configurationsます。

  2. Application &&を選択すると、現在のプロジェクトが選択されます。

  3. Include dependencies with "Provided" scopeチェックしInclude dependencies with "Provided" scope

  4. OK - > RUN




Links