Spring Boot JSP サンプル アプリケーションに精通している
ただし、その例ではWAR
パッケージングを使用しています。で同じことは可能<packaging>JAR</packaging>
ですか?
私の目標は、アプリの構造を簡素化するためにJSP
sを配置することです。src/main/resources/jsp
Spring Boot JSP サンプル アプリケーションに精通している
ただし、その例ではWAR
パッケージングを使用しています。で同じことは可能<packaging>JAR</packaging>
ですか?
私の目標は、アプリの構造を簡素化するためにJSP
sを配置することです。src/main/resources/jsp
@Andy Wilkinsonが言ったように、JSPに関連する制限があります。アプリケーションを としてパッケージ化し、 としてwar
実行してくださいjar
。これは春のサイトで文書化されています。
Tomcat では、war パッケージを使用すると動作するはずです。つまり、実行可能な war が動作します (...)。Tomcat のファイル パターンがハードコードされているため、実行可能な jar は機能しません。
非推奨の古い回答
はい、これは Spring Boot で可能です。
この例を見てください: https://github.com/mariuszs/spring-boot-web-jsp-example。
これを行うには、spring-boot-maven-pluginまたは同等の gradle を使用します。
このプラグインを使用すると、jar が実行可能になり、JSP ファイルを提供できます。
$ mvn package
$ java -jar target/mymodule-0.0.1-SNAPSHOT.war
(上記のコマンド .war のアーティファクトの拡張子に注意してください) または単に
$ mvn spring-boot:run
あなたの最善の策は、パッケージの種類を war に変更することです。これ以上変更しなくても機能するはずです。
上記のコメントで述べたように、いくつかの制限があります。
なんらかの理由で、戦争のパッケージを処理できない場合は、ハックがあります。spring-boot の古いバージョンでそれを行ったこの男への完全な功績。
BOOT-INF/classes
これを行う 1 つの方法は、Tomcat をパーソナライズして Tomcat の ResourceSetに追加することです。Tomcat では、スキャンされたすべてのリソースが ResourceSet と呼ばれるものに入れられます。たとえば、サーブレット 3.0 仕様のアプリケーション jar パッケージの META-INF/resources がスキャンされ、ResourceSet に入れられます。
ここで、ファット jar の BOOT-INF/classes ディレクトリを ResourceSet に追加する方法を見つける必要があります。これは tomcat LifecycleListener インターフェイスを介して実行できます。Lifecycle.CONFIGURE_START_EVENT
イベントでは、BOOT-INF/classes URL を取得し、この URL を WebResourceSet に追加します。完全な例はこちらにありますが、次のように実行できます。
import org.apache.catalina.Context;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(name = "tomcat.staticResourceCustomizer.enabled", matchIfMissing = true)
public class TomcatConfiguration {
@Bean
public WebServerFactoryCustomizer<WebServerFactory> staticResourceCustomizer() {
return new WebServerFactoryCustomizer<WebServerFactory>() {
@Override
public void customize(WebServerFactory factory) {
if (factory instanceof TomcatServletWebServerFactory) {
((TomcatServletWebServerFactory) factory)
.addContextCustomizers(new org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer() {
@Override
public void customize(Context context) {
context.addLifecycleListener(new StaticResourceConfigurer(context));
}
});
}
}
};
}
}
そして、次のように LifecycleListener を使用します。
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.catalina.Context;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.WebResourceRoot.ResourceSetType;
import org.springframework.util.ResourceUtils;
public class StaticResourceConfigurer implements LifecycleListener {
private final Context context;
StaticResourceConfigurer(Context context) {
this.context = context;
}
@Override
public void lifecycleEvent(LifecycleEvent event) {
if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {
URL location = this.getClass().getProtectionDomain().getCodeSource().getLocation();
if (ResourceUtils.isFileURL(location)) {
// when run as exploded directory
String rootFile = location.getFile();
if (rootFile.endsWith("/BOOT-INF/classes/")) {
rootFile = rootFile.substring(0, rootFile.length() - "/BOOT-INF/classes/".length() + 1);
}
if (!new File(rootFile, "META-INF" + File.separator + "resources").isDirectory()) {
return;
}
try {
location = new File(rootFile).toURI().toURL();
} catch (MalformedURLException e) {
throw new IllegalStateException("Can not add tomcat resources", e);
}
}
String locationStr = location.toString();
if (locationStr.endsWith("/BOOT-INF/classes!/")) {
// when run as fat jar
locationStr = locationStr.substring(0, locationStr.length() - "/BOOT-INF/classes!/".length() + 1);
try {
location = new URL(locationStr);
} catch (MalformedURLException e) {
throw new IllegalStateException("Can not add tomcat resources", e);
}
}
this.context.getResources().createWebResourceSet(ResourceSetType.RESOURCE_JAR, "/", location,
"/META-INF/resources");
}
}
}