32

Spring Boot JSP サンプル アプリケーションに精通している

ただし、その例ではWARパッケージングを使用しています。で同じことは可能<packaging>JAR</packaging>ですか?

私の目標は、アプリの構造を簡素化するためにJSPsを配置することです。src/main/resources/jsp

4

11 に答える 11

37

@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
于 2014-01-20T21:21:10.037 に答える
5

あなたの最善の策は、パッケージの種類を war に変更することです。これ以上変更しなくても機能するはずです。

上記のコメントで述べたように、いくつかの制限があります。

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations

于 2015-07-12T09:38:55.700 に答える
3

なんらかの理由で、戦争のパッケージを処理できない場合は、ハックがあります。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");

        }
    }
}
于 2018-06-13T20:48:01.827 に答える