外部Tomcatを使用してSpringboot
1.代わりに戦争のパック遊ぶのpom.xmlを修正
<packaging>war</packaging>
2. Springboot構築されたTomcatのスコープを変更provided
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
3.書き換えSpringBootServletInitializer
@SpringBootApplication
public class Bootstrap extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Bootstrap.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Bootstrap.class);
}
}
戦争4.maven包装袋の後、Tomcatののwebappsディレクトリにそれを置きます。
戦争のパッケージにアクセスするためのインターフェイス、デフォルトのURLたとえば、接頭辞としてプロジェクト名を追加する必要があります。http:// localhost:8080 / {プロジェクト名} /ユーザー/ 123456
原理分析
ServletContainerInitializer
サーブレットコンテナが起動すると、各ジャーパッケージの現在のアプリケーションパススキャンMETA-INF\services
内のファイルjavax.servlet.ServletContainerInitializer
そのファイルの内容は、ServletContainerInitializer実装クラスの完全なクラス名であり、そのonStartup()メソッドを呼び出します。たとえば、春のWebパッケージでは、ファイルの内容がされorg.springframework.web.SpringServletContainerInitializer
、以下のように、そのソースコードは次のとおりです。
// 容器启动时,将 WebApplicationInitializer 的所有子类传递至 webAppInitializerClasses
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
/**
* @param webAppInitializerClasses @HandlesTypes 导入的类
* @param servletContext 当前 web 应用 servlet 上下文
*/
@Override
public void onStartup(@Nullable Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<>();
for (Class<?> waiClass : webAppInitializerClasses) {
// 过滤出可用的 WebApplicationInitializer
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
initializers.add((WebApplicationInitializer)ReflectionUtils.accessibleConstructor(waiClass).newInstance());
}
}
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}
コンテナが開始されると、実行SpringServletContainerInitializer.onStartup()メソッドは、HandlesTypes @注釈はすべてのサブクラスWebApplicationInitializer(前の例では、クラスはブートストラップが実装開始することを宣言しSpringBootServletInitializerは、パラメータwebAppInitializerClassesメソッドに渡されるその実現Aです)。
OnStartup()メソッドは、ブートストラップWebApplicationInitializerサブクラスで利用可能webAppInitializerClassesをフィルタリングし、コールバックSpringBootServletInitializer OnStartupの()メソッドは、以下のソースコード:
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext rootAppContext = createRootApplicationContext(servletContext);
}
protected WebApplicationContext createRootApplicationContext(ServletContext servletContext) {
SpringApplicationBuilder builder = createSpringApplicationBuilder();
// 指定主类 Bootstrap
builder.main(getClass());
// 回调 Bootstrap 重写的方法
builder = configure(builder);
return run(builder.build());
}
このメソッドは、現在のWebアプリケーションのコンテキストを設定します。メインクラス、登録のServletContextを指定するには、configure()、実行実行を呼び出します。
設定ブートストラップを()書き換え、その方法は、メインクラスを指定するには、書き換えを実行し、最終的にはアプリケーションによって達成のでSpringboot実行を開始します。