5

私はgrailsインタラクティブモードで実行しているgrailsアプリケーションを持っています。このアプリケーションには、サービス、tagLibs、gsps などが含まれていますが、最も重要なのは、src/groovy フォルダーに groovy ファイルが含まれていることです。

これらの groovy ファイルの 1 つはAppConstants.groovyと呼ばれ、多数の静的変数が含まれています。

public static final String VARIABLE1 = "VARIABLE VALUE"

これを非インタラクティブ モードで実行しても問題はありません。この変数に加えられた更新は、次回のデプロイ時に実行中のアプリに反映されます。ただし、インタラクティブ モードでは、 と を呼び出しても、変数に加えられた変更はVARIABLE1アプリに反映されません。変更を反映するには、対話モードを終了して再起動する必要があります。exitrun-app

最初は、これはキャッシュの問題である可能性があり、静的な最終変数がキャッシュされていて、JVM が再起動されていないため、このキャッシュが更新されていないのではないかと考えました。ただし、これまでアプリケーションに存在しなかった新しい変数を追加すると、インタラクティブ モードが再起動されるまで、アプリケーションの残りの部分では使用できないことに気付きました。

この背後にある理由は何ですか?exit対話型コンソールでこれを見ることができるように、クラスはコンパイルされているため、必ずしも実行中ではなく、少なくともrun-app.

追加情報: Grails バージョン 2.1.0

4

1 に答える 1

1

少しテストを行ったところ、次のことがわかりました。

  1. -reloading変数の更新を決して許可せずにプロセスを開始するため、grails -reloadingまたはとして開始しますgrails -reloading run-app

  2. 上記のようにプロセスを開始すると、非final変数は正しくリロードされます。public static String VARIABLE1 = "VARIABLE VALUE"値を更新するとリロードして表示されます

  3. final変数はリロードされません。そのpublic static final String VARIABLE1 = "VARIABLE VALUE"ため、リロードして新しい値を表示しません。

いくつかの変数も作成しましたが、いくつfinalかはそうではありませんでした。-reloadingfinal変数を使用している限り、リロードされますが、リロードされfinalません。

public static final String VARIABLE1 = "VARIABLE VALUE"
public static String VARIABLE2 = "NON FINAL VARIABLE VALUE"

このシナリオVARIABLE1では、再起動するまで変更されませんVARIABLE2。更新して保存すると変更されます。

于 2012-12-18T20:21:52.767 に答える