背景
Springbootは、Springboot Devtoolを使用してホット展開を実現するために、すべての人がますます使用されています
同じクラスCastExceptionが表示されます
分析します
まず、クラスローダーが異なるため、同じクラスのCastExceptionが表示されるかどうかを判断します。
クラスが同じかどうかは2つの要因に依存します
つまり、さまざまなクラスローダーによって説明されるクラスは異なるクラスです
私たちが学ぶときにJDBCの一般的な使用
/** *クラスに関連付けられた{@code class}オブジェクトを返します。このメソッドの呼び出しは、 * * * <blockquote> * {@code class.forname(classname、true、currentloader)} * </blockquote> * {@code currentloader}は、現在のクラスの定義クラスローダーを示します。 * * <p>たとえば、次のコードフラグメントは、 * {@code java.lang.thread}という名前のクラスの * runtime {@code class}記述子を返します。 * {@code x}という名前のクラスが初期化されます。 * * @param className目的のクラスの完全な資格のある名前。 * @return *指定された名前のクラスの{@code class}オブジェクト。 * @exception linkageError linkageが失敗した場合 * @exception exception exceptionizalErrorこのメソッドによって引き起こされた初期化が失敗します * @exception classnotfoundexception classが見つからない場合 */public static class <?上記から、さまざまなクラスローダーによって説明された同じクラスが互いに変換できないことを理解できます。
このようにして、DevToolsをターゲットにします。
スプリングブートに次の依存関係を導入しました
<Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-devtools </artifactid> <optional> true </optional> </dependency>
では、DevToolの依存関係を除外する方法は?
Application.Propertiesを追加します
spring.devtools.restart.enabled = false
使用されている再起動メインはまだ始まるときにまだ見ることができることがわかりました
2018-03-19 22:04:37.641 INFO 53428 --- [RestArtedMain] SWSMAREQUESTMAPPINGHANDLERADAPTER:@ControllerAdviceを探しています:org.springframework.boot.context.embedded.annotationconfigembeddedwebapplicationcontext @1943f7a3: 22:03:34 CST 2018];コンテキスト階層のルート
2018-03-19 22:04:37.654 Info 53428 --- [RestArtedMain] SWSMMAREQUESTMAPPINGHANDLERADAPTER:検出されたresponsedodyadvice bean in org.springframework.boot.actuate.autoconfigure.endpointwebmvmvcyporedimamagemanagemedcontextconfiguration $ configuration
2018-03-19 22:04:37.956 INFO 53428 --- [RestArtedMain] OSWSHANDLER.SIMPLERLLHANDLERMAPPING:マッピングされたURLパス[/swagger-ui.html]
2018-03-19 22:04:37.956 Info 53428 --- [RestartedMain] OSWSHANDLER.SIMPLERLHANDLERMAPPING
スレッドがrestartedmainという名前のスレッドがspring.devtools.restart.enabled無効なのはなぜですか?
コード
ApplicationListenerは、DevToolsに対応するパッケージで使用されます
private void onapplicationstartingEvent(ApplicationStartingEventイベント){//スプリング環境を使用するには時期尚早ですが、//ユーザーがシステムプロパティを使用して再起動を無効にすることを許可する必要があります。 string enabled = system.getProperty(enabled_property); if(enabled == null || boolean.parseboolean(enabled)){string [] args = event.getargs(); defaultrestartinitializer initializer = new defaultrestartinitializer(); boolean restartonInitialize =!agentReloader.isactive(); restarter.initialize(args、false、initializer、restartonitialize); } else {restarter.disable(); }}Restarterが実際にSpring環境ではなくシステム変数から読み取られていることは明らかです。コメントが言っているように、現時点では実際にはSpringプロパティを使用するには時期尚早です。
したがって、システム変数を使用できます
したがって、JVMパラメーターを使用できます
-dspring.devtools.restart.enabled = false
案の定、現時点ではすべてが大丈夫です
2018-03-19 22:18:12.928 Info 66260 --- [Main] com.f6car.base.Application:次のプロファイルがアクティブです:DEV
2018-03-19 22:18:13.131 Info 66260 --- [Main] AtionConfigemBededWebApplicationContext:更新org.springframework.boot.context.embedded.annotationConfigembeddeddedwebapplicationcontext@2a4354cbコンテキスト階層のルート
では、Springの構成ファイルの構成の目的は何ですか?
/***プロパティを再起動します。 */public static class Restart {private static final string default_restart_excludes = " +" meta-inf/resources/**、resources/**、static/**、public/**、templates/**、 " + **、" + ** "**/*test.class、**/*tests.class、git.properties、meta-inf/bundinfo.properties";プライベート静的最終long default_restart_poll_interval = 1000; private static final long default_restart_quiet_period = 400; /***自動再起動を有効にします。 */ private boolean enabled = true; /***フル再起動のトリガーから除外するパターン。 */ private string exclude = default_restart_excludes; /***フル再起動のトリガーから除外する必要がある追加のパターン。 */ private string adthideExclude; /***クラスパスの変更を投票する間に待つ時間(百万秒)。 */ private long pollinterval = default_restart_poll_interval; /** * ClassPathの変更なしに必要な静かな時間(百万秒)の量 *再起動がトリガーされる前に。 */ private long quietperiod = default_restart_quiet_period; /***変更されたときに再起動チェックがトリガーされる特定のファイルの名前。 * ClassPathファイルの変更が指定されていない場合、再起動がトリガーされます。 */ private string triggerfile; /***変更を監視する追加のパス。 */ private list <file> adlidationPaths = new ArrayList <file>(); public boolean isEnabled(){return this.enabled; } public void setEnabled(boolean enabled){this.enabled = enabled; }コードから、リスニングを自動的に再起動できるかどうかを構成するために使用されるようです
/***ローカル再起動構成。 */ @conditionalonproperty(prefix = "spring.devtools.restart"、name = "enabled"、matchifmissing = true)static class restartconfiguration {@autowired private devtoolspropertiesプロパティ。 @eventlistener public void onclasspathchanged(classpathchangedevent event){if(event.isrestartrequired()){restarter.getInstance()。 }} @bean @conditionalonmissingbean public classpathfilesystemsystemwatcher classpathfilesystemwatcher(){url [] url = restarter.getInstance()。getInitialurls(); classPathFilesSystemWatcher Watcher = new ClassPathFilesSystemWatcher(FilesystemWatcherFactory()、ClassPathRestArtStrategy()、URLS); watcher.setStopWatcherOnRestart(true);返品ウォッチャー。 } @bean @conditionalonmissingbean public classpathrestartStrategy classpathrestartartStrategy(){return new PatternClassPathRestArtStrategy(this.Properties.getRestart()。getAllexClude()); } @bean public hateoasobjenesiscachedisabler hateoasobjenesiscachedisabler(){return new hateoasobjenesiscachedisabler(); } @bean public filesystemwatcherfactory filesystemwatcherfactory(){return new filesystemwatcherfactory(){@override public filesystemwatcher getFilesystemWatcher(){return newFilesSystemWatcher(); }}; } private filesystemwatcher newfilesystemwatcher(){restart restartproperties = this.properties.getRestart(); filesystemWatcher watcher = new FilesystemWatcher(true、rettartProperties.getPollinterval()、RestArtProperties.getQuietPerioD()); string triggerfile = restartproperties.getTriggerFile(); if(stringutils.haslength(triggerfile)){watcher.setTriggerFilter(new TriggerFileFilter(TriggerFile)); } list <file> aditionalPaths = rettartProperties.getAdditionAlpaths(); for(file path:addationalpaths){watcher.addsourcefolder(path.getabsolutefile()); } watcherを返します。 }}}構成全体が、対応するWatchServiceを登録するかどうかを返します
もちろん、瓶を削除することもできます
このコードにコメントするとき、あなたは再度を取る必要があることに注意する必要があります
MVNクリーン
それ以外の場合は、jarを自動的に除外することはできない場合があります
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。