私はスプリングブーツの問題を解明しようとしてきましたが、春が初めてなので、ここで助けを求めることを考えました。
スプリングブートベースのJavaアプリケーションがデーモンとして実行され、リモートサーバーにGETリクエストを送信します(クライアントとしてのみ機能します)。
しかし、私のSpring Bootアプリケーションは、組み込みのTomcatコンテナを内部的に起動します。私の理解では、Javaアプリがサーバーとして機能する場合、Tomcatが必要になります。しかし、私のアプリケーションはリモートマシンのGET APIのコンシューマーにすぎないのに、なぜ組み込みのTomcatが必要なのですか?
私のpomファイルでは、GET呼び出しを行うためにも必要であると想定して、spring-boot-starter-webを指定しました。
しかし、組み込みTomcatの無効化について調査した後、解決策を見つけました。
以下の変更を行うには、
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
&application.yml内
spring:
main:
web-environment: false
Application.ymlの変更により、私のjarは開始されておらず、ログバックログに何も記録せずに直接中止されます。
ここで、application.ymlの変更を削除すると、jarが起動します(@SpringBootApplication annoの最初の変更のみ)が、いくつかの例外が発生します。
[main] o.s.boot.SpringApplication : Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
ここでの私の疑問は、
1)Tomcatは、スタンドアロンであろうと組み込みであろうと、リモートマシンに対してGET API呼び出しを行うだけのアプリケーションに本当に必要ですか?
2)この例外を克服し、埋め込まれたTomcatを安全に削除し、それでもGET API呼び出しを実行するにはどうすればよいですか?
ここでは、Webアプリケーションのテンプレートから始めて、Webアプリケーションの側面をオフにしようとしているため、完全に間違った方向に進んでいるようです。
関連するSpring Guide で詳しく説明されているように、通常のコマンドラインクライアントテンプレートから開始してそこから移動する方がはるかに優れています。
基本的に、アプリケーションは
@SpringBootApplication
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String args[]) {
SpringApplication.run(Application.class);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
return args -> {
Quote quote = restTemplate.getForObject(
"http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
log.info(quote.toString());
};
}
}
そして、pom to
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
あなたの質問に答える:
1)defautによって埋め込まれます-クライアントのHTTPリクエストには必要ありません。
2)WebなしでSpringBootアプリケーションにCommandLineRunnerを使用できます。
@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootConsoleApplication.class, args);
}
@Override
public void run(String... args) {
// TODO: start you thread here to execute client HTTP REST requests (or any other job you need)
}
}
これにより、Webが完全に無効になります。手動での設定ミスによる問題はありません。
ここにいくつかのドキュメントがあります: http://www.baeldung.com/spring-boot-console-app
また、spring-boot-starter-webの依存関係をspring-boot-starterに置き換える必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
私はこの問題を抱えていました。私が望んでいたのは、クライアントにRESTリクエストを作成させることでした。残念ながら、Jettyを埋め込む依存関係があり、Jettyは常に起動されていました。
Jettyを無効にするために必要なのは、applications.propertiesに次のエントリを追加することだけでした。
spring.main.web-application-type=none
それはそれを修正しました。