0

私は 2 つの小さなアプリを持っています。1 つは用途spring-boot-starter-amqp、もう 1 つは用途spring-data-hadoop-bootです。問題なく個別に実行できます。

それらを結合すると、アプリの起動が例外で失敗します: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

私のメインクラスはかなり汎用的で、両方とも別々にうまく動作します:

@PropertySource("file:conf/app.properties")
@SpringBootApplication
public class Job {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Job.class, args);
    }
}

私はここで途方に暮れています。私の知る限り@SpringBootApplication、自動構成やコンポーネントのスキャンなど、必要なすべての注釈が含まれています。使用していないため、Web環境を構成する必要はありませんでした。両方の依存関係がクラスパスにあるのに、なぜそれを行う必要があるのですか? また、どうすれば修正できますか?

アップデート

Spring Boot コードを少し掘り下げました。主な問題はSpringApplication.deduceWebEnvironment()、クラスパス内の特定のクラスの存在に基づいて、どのような環境を構成する必要があるかを自動的に検出することです。

Web 環境では、2 つのクラスがチェックされています。両方がクラスパスにある場合、適切な構成が必要な Web 環境が検出されます。

  • javax.servlet.Servlet
  • org.springframework.web.context.ConfigurableWebApplicationContext

spring-boot-starter-amqp:1.3.1.RELEASEcontains ConfigurableWebApplicationContext、およびspring-data-hadoop-boot:2.3.0.RELEASE-cdh5contains Servlet(ネイティブ Hadoop ライブラリ内)。

現在、単独で実行すると、どちらの場合も上記のクラスのいずれかが欠落しているため、Web 環境が設定されていません。

しかし、両方を使用すると、両方のクラスが見つかります。Web 環境が検出され、偽陽性であり、構成が必要ですが、提供できません (そして提供したくありません)。

質問は今です-クラスパスにそれらのクラスがある場合でも、非Web環境を強制できますか? または、問題を解決する他の方法はありますか? (Gradle の依存関係から除外する以外)

4

1 に答える 1

0

解決しました。

この質問に続いて: spring-web の spring-boot 自動構成を防止する方法は?

次のようにアプリケーションを実行します。

@PropertySource("file:conf/app.properties")
@SpringBootApplication
public class Job {
    public static void main(String[] args) throws Exception {
        new SpringApplicationBuilder(Job.class).web(false).run(args);
    }
}

上記の質問への回答でも、プロパティspring.main.web_environment=falseまたは注釈を使用することをお勧めします@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)。どちらのソリューションもうまくいきませんでした。私の場合、プログラムによるソリューションのみが機能します。

于 2016-01-21T06:35:43.390 に答える