web-dev-qa-db-ja.com

Spring MVCとブートで静的コンテンツを更新する

Webアプリケーションを構築するために、Spring MVC&BootおよびAngularJを評価しています。静的コンテンツ(html、js、css)を変更すると、毎回アプリケーションを再起動する必要があるという問題に遭遇しました。静的コンテンツの変更のためにアプリケーション全体を再起動するのは効率的ではないため、それを解決する方法があることを願っています。私が試した他のすべてのWebアプリフレームワークでは、静的コンテンツファイルをその場で更新できます(Spring MVCや単純な古いWARアプリケーションでも)。

「Spring Boot Actuatorを使用したRESTful Webサービスの構築」ガイド( http://spring.io/guides/gs/actuator-service/ )からプロジェクトをセットアップしました。基本的に、Spring BootとMVCコントローラーを使用してRESTサービスを作成します。さらに、「AngularJSでRESTful Webサービスを使用する」ガイド(- http:// spring .io/guides/gs/consuming-rest-angularjs / )AngularJSを使用してフロントエンドを構築します。RESTサービスからの応答を表示するWebページを作成します。唯一の変更私が行ったのは、リクエストが「 http://rest-service.guides.spring.io/greeting 」ではなく、アプリケーションに対して行われることです。静的コンテンツは「src/main/resources/public "フォルダー。この設定は、静的コンテンツを再ロードしないことを除いて、正常に機能します。

41
palto

ドキュメントには、「すべての最新のIDEが静的リソースの再読み込みを許可し、通常はJavaクラスの変更)のホットスワップも許可しています」( https://docs.spring.io/spring-boot /docs/current-SNAPSHOT/reference/html/howto.html#howto-hotswapping )それは本当です。Eclipseはデフォルトで多かれ少なかれそれを行います。私はIntelliJユーザーではありませんが、自動的にビルドするように設定することもできます。

12
Dave Syer

元の問題の要約

静的コンテンツ(html、js、css)に変更を加えると、毎回アプリケーションを再起動する必要があるという問題に遭遇しました

私は同じ問題を抱えていて、最終的に追加して解決しました

<configuration>
    <addResources>true</addResources>
</configuration>

spring-boot-maven-plugin の中に pom.xmlこのspring-boot-devtoolsの事に混乱しましたが、私がやったことには何の効果もありませんでした。

静的コンテンツは「src/main/resources/public」フォルダーに保存されます。

あなたの道は大丈夫です。 src/main/resources/staticも大丈夫です。

31
eigil

ああ...私もこの問題に出くわしました。

静的コンテンツをクラスパスsrc/main/resources/publicフォルダーに配置する代わりに、他のJava Webアプリと同じようにsrc/main/webappに配置します。埋め込みTomcatは自動的にそれらが変わるたびにそれらをリロードします。

コメントで述べたように、デフォルト設定にはsrc\main\webappにあるリソースは含まれません。この問題を回避するには、pom.xml <build>ノードに次を追加するだけです。

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/classes/static</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/webapp</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

リソースプラグインを使用すると、実行可能JARを実行してローカル開発を行うことができます。

Java -jar target/.jar

実行中に、Chrome Dev ToolsまたはIDEを使用して、再起動せずにファイルを変更できます。ただし、ビルドを実行するたびに、生成されたパッケージには、src\main\webappsrc\main\resources\staticの下にあるすべてのファイルが含まれます。

26
Steve

同僚と私もこの問題に出会いました。 IntelliJ documentation ...で答えを見つけました.

メインメニューで、Run |を選択します。変更されたクラスの再読み込み

8
hyness

私のソリューション(Kotlinで書かれていますが、非常に明白です):

@Controller
class WebController : WebMvcConfigurerAdapter() {

    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        System.getProperty("resources.local.path")?.let {
            registry.addResourceHandler("/**").addResourceLocations(it)
        }
    }
...
}

主なアイデアは、条件付きで独自のリソースハンドラを追加できることです。例えば。いくつかのシステムプロパティが設定されている場合(resources.local.path)、プロパティの値を使用してリソースの場所を追加します。次に、開発時にこのプロパティを「-Dresources.local.path = file:/ Users/andrey/Projects/gsp-test/src/main/resources/static /」などの適切な値に設定します。

末尾のスラッシュを忘れないでください。

4
viator

私は同じ問題を抱えていました、ここで提案された解決策は論理的であり、breifで私のために働いた:1- ctrl + shift + A 2-レジストリの検索3- "compiler.automake.allow.when.app。実行中」と確認してください http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading-static-content/

2
ameen

依存関係をもう1つ追加するだけで実行できます

あなたグラドル

compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '1.3.0.RELEASE'

あなたの中にPom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>1.3.0.RELEASE</version>
</dependency>
1
Dev Sabby

最終的に使用したのは Browsersync with grunt でした。 browsersyncとgruntは、ディスク上の静的リソースを監視し、ファイルを編集するとブラウザーを更新します。一種のプロキシとして機能します。これにより、UIの変更をビルドまたは再起動せずにすぐに確認できます。

Grunt、browsersync、spring boot、angularjsは、プロジェクトのセットアップに使用した JHipster を使用すると設定されます。

確かに、これにはIDEよりもはるかに多くのツールが必要であり、さらに複雑なので、すべてのプロジェクトにこれを推奨することはありません。

1
palto

spring-boot-devtoolsは、not編集された静的htm/jsの「ホットデプロイ」のソリューションです。

Intellij内でWebファセットを構成して、resources/static内のhtml/jsファイルを編集するときに、intellijが更新されたファイルを./targetにコピーし、内部で起動したスプリングブートアプリケーションがそのコンテンツを自動的に表示するように設定しました

https://www.jetbrains.com/help/idea/2016.2/configuring-static-content-resources.html を参照してください

1
pbirnie

@eigilは、MavenビルドのaddResources構成を実現しました。私はgradleビルドでspring-boot-gradle-pluginを使用していますが、これを見つけました Spring Boot github issue 、およびSpring Boot doc このオプションも述べました 。このディレクティブをbuild.gradleに追加し、GradleタスクbootRunを実行するだけで、リソースファイルが保存されるとすぐに更新されます。ご参考までに。

1
briskr

Java @viatorの回答のバージョン:

@Configuration
class WebMvcConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/dist/*.js").addResourceLocations(
            "file:src/main/TypeScript/dist/"
        );
    }
}
1
wizawu

1.5.8.RELEASEを使用しています。

特に静的ファイルまたはjspファイルの変更を即座に更新します。

Mavenを使用している場合。これをpom.xmlに追加する必要があります

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

そして、これでSpring Bootを起動する必要があります:

mvn clean spring-boot:run

完全な例と詳細はこちら https://www.surasint.com/spring-boot-with-auto-update-changed-files-example/

1

Eclipseの場合、最小構成として[プロジェクト]-> [自動的にビルド]オプションをアクティブにする必要があります。

1
tObi

静的なWebコンテンツを提供する方法は2つあります

  1. クラスパスから(デフォルトではsrc/main/resources/staticまたはsrc/main/resources/publicまたはMETA-INF/resources /)
  2. ファイルシステムから(デフォルトではsrc/main/webappごと)

解決策1)を選択した場合-静的Webコンテンツがそのjar内にあるため、jarを安全にコピーできます。サーバーが変更を取得するようにするには、(自動)ホットスワップを行う必要があります。

解決策2)を選択した場合-すべてがそのまま使用でき、すべての変更が自動的に選択されます。ただし、最終的なjarを別の場所にコピーすると、動作が停止します。 application.propertiesで絶対パスを指定しない限りです。例えば:

spring.resources.static-locations=file:///C:/myspringbootapp/src/main/webapp

したがって、解決策2)は簡単ですが、移植性が低くなります。解決策1)は移植可能ですが、使用するのがより困難です(ide config)。

0
Holgi P