Hintergrund
Springboot wird zunehmend von jedem verwendet, um mit Springboot Devtool eine heiße Bereitstellung zu erreichen
Die gleiche Klasse CastException erscheint
analysieren
Bestimmen Sie zunächst, ob die CastException derselben Klasse beispielsweise erscheint, da der Klassenloader unterschiedlich ist.
Ob eine Klasse gleich ist, hängt von zwei Faktoren ab
Das heißt, die Klasse, die von verschiedenen Klassenladern erklärt wurde, ist eine andere Klasse
Gemeinsame Verwendung von JDBC, wenn wir lernen
/** * Gibt das {@code -Klasse} -Objekt zurück, das der Klasse oder * Schnittstelle mit dem angegebenen String -Namen zugeordnet ist. Das Aufrufen dieser Methode ist * äquivalent zu: * * <Blockquote> * {@Code class.forname (className, true, currentloader)} * </blockquote> * wobei {@Code currentloader} den Definieren der Klassenlader * der aktuellen Klasse bezeichnet. * * <p> Zum Beispiel gibt das folgende Code -Fragment die * Laufzeit {@Code class} Deskriptor für die Klasse mit dem Namen * {@Code java.lang.thread} zurück: * * <Blockquote> * {@Code class t = class.forname ("java.lang.thread")} * </blockquote> * </blockquote> * </blockquote> * </block - block · block · block. verursacht, dass die Klasse * {@code x} initialisiert wird. * * @param className Der voll qualifizierte Name der gewünschten Klasse. * @return das {@Code -Klasse} -Objekt für die Klasse mit dem angegebenen Namen. * @Exception linkageError Wenn die Verknüpfung fehlschlägt * @Exception ExceptionInInitializerError Wenn die Initialisierung provoziert * nach dieser Methode fehlschlägt * @Exception ClassNotFoundException, wenn die Klasse nicht gefunden werden kannAus dem obigen können wir verstehen, dass dieselben Klassen, die von verschiedenen Klassenloadern erklärt wurden, nicht zueinander konvertieren können.
Auf diese Weise richten wir uns an Devtools.
Wir haben die folgenden Abhängigkeiten im Springboot vorgestellt
<Depopenty> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Devtools </artifactid> <option> true </optional> </abhängig>
Wie kann man die Abhängigkeiten von Devtool ausschließen?
Fügen Sie in application.Properties hinzu
spring.devtools.restart.enabled = false
Ich stellte fest, dass der verwendete Neustart bei Beginn immer noch gesehen werden kann
2018-03-19 22:04:37.641 INFO 53428 --- [restartedMain] swsmmaRequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7443f7a3: startup date [Mon Mar 19 22:03:34 CST 2018]; Kontexthierarchie
2018-03-19 22: 04: 37.654 Info 53428 --- [RestartedMain] SwsmmarequestMappingHandlerAdapter: ResponseBodyAdvice Bean in org.
2018-03-19 22: 04: 37.956 Info 53428 --- [NeustartedMain] oswshandler.Simpleurlhandlermaping: Zugeordnete URL-Pfad [/Wagger-ui.html] auf Handler des Typs [Klasse org.springframework.web.Servlet.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resource.resources
2018-03-19 22: 04: 37.956 Info 53428 --- [NeustartedMain] Oswhandler.SimpleurlHandlermaping
Warum wird der Thread namens neu gestartete Main Set Spring.devtools.restart.Enabled Invaly?
Code
ApplicationListener wird im Paket verwendet, das Devtools entspricht
private void OnapplicationStartingEvent (ApplicationStartingEvent Event) {// Es ist zu früh, um die Frühlingsumgebung zu verwenden, aber wir sollten weiterhin zulassen, dass Benutzer Neustart mithilfe einer Systemeigenschaft deaktivieren. String enabled = system.getProperty (enabled_property); if (enabled == null || boolean.parseboolean (aktiviert)) {string [] args = event.getArgs (); DefauLtrestartinitializer initializer = new Defaultrestartinitializer (); boolean restartoninitialize =! agentreloader.isactive (); Restarter.initialize (args, false, initializer, restartoninitialize); } else {restarter.disable (); }}Es ist offensichtlich, dass der Restarter tatsächlich aus Systemvariablen und nicht aus der Federumgebung gelesen wird. Wie der Kommentar sagt, ist es tatsächlich zu früh, um Spring Property in diesem Moment zu verwenden.
Daher können Systemvariablen verwendet werden
Daher können wir JVM -Parameter verwenden
-Dspring.devtools.restart.enabled = false
Sicher genug, zu dieser Zeit ist alles in Ordnung
2018-03-19 22: 18: 12.928 Info 66260 --- [Main] com.f6car.base.Application: Die folgenden Profile sind aktiv: Dev: Dev:
2018-03-19 22: 18: 13.131 Info 66260 --- [Main] ATionConFigembededWebApplicationContext: Aktualisieren org.springFramework.boot.Context.Embedded.AnnotationConFigembededwebaplicationContext 2013354CB: StartUp Date [mon marnconication context 20133354cb: startUp-Datum [mon marnconication context); Kontexthierarchie
Was ist der Zweck der Konfiguration in der Konfigurationsdatei von Spring?
/*** Starten Sie Eigenschaften neu. */public static class neu starten {private statische endgültige String default_restart_excludes = "meta-inf/maven/**," + "meta-inf/ressourcen/**, Ressourcen/**, static/**, öffentlich/**, Vorlagen/**," + "**/*test.class, **/*tests.class, git.properties, meta-inf/build-info.properties"; private statische endgültige long default_restart_poll_interval = 1000; private statische endgültige long default_restart_quiet_period = 400; /*** automatischer Neustart aktivieren. */ privat boolean aktiviert = true; /*** Muster, die vom Auslösen eines vollständigen Neustarts ausgeschlossen werden sollten. */ private String exklued = default_restart_excludes; /*** Zusätzliche Muster, die vom Auslösen eines vollständigen Neustarts ausgeschlossen werden sollten. */ private Zeichenfolge zusätzlichExclude; /*** Zeit (in Millionen Sekunden), zwischen den Umfragen für Klassenpfadänderungen zu warten. */ private long pollinterval = default_restart_poll_interval; /** * Menge an ruhiger Zeit (in Millionen Sekunden) ohne Änderungen des Klassenpfades * Bevor ein Neustart ausgelöst wird. */ private long quietperiod = default_restart_quiet_period; /*** Name einer bestimmten Datei, die bei der Änderung die Neustartprüfung auslöst. Wenn * keine Änderung von ClassPath -Dateien angegeben wurde, wird der Neustart ausgelöst. */ private String TriggerFile; /*** Zusätzliche Wege, die nach Änderungen achten können. */ private Liste <Datei> zusätzlichPaths = new ArrayList <Datei> (); public boolean isenabled () {return this.enabled; } public void setEnabled (boolean aktiviert) {this.Enabled = aktiviert; }Aus dem Code scheint es verwendet zu werden, um zu konfigurieren, ob das Zuhören automatisch neu gestartet werden kann
/*** Lokale Neustartkonfiguration. */ @ConditionalonProperty (Präfix = "Spring.devtools.restart", name = "enabled", matchiFming = true) statische Klasse restartConfiguration {@autowired private devtoolSpropties -Eigenschaften; @EventListener public void onclassPathChanged (classPathChangeDeDEvent Ereignis) {if (event.isrestArtraPrequired ()) {restarter.getInstance (). Restart (neue DateiwatchingFailureHandler (DateisystemWatcherFactory ()); }} @Bean @ConditionalonmissingBean public classPathFilesystemWatcher classPathFilesSystemWatcher () {url [] urls = restarter.getInstance (). GetInitialurls (); ClassPathFilesSystemWatcher watcher = new classPathFileSystemWatcher (DateisystemWatcherFactory (), classpathrestartStrategy (), URLs); watcher.setStopWatcheronRestart (true); Rückkehrwächter; } @Bean @ConditionalonmissingBean public classPathrestartStrategy classpathrestartStrategy () {return New musterClasspathrestartStrategy (this.Properties.getrestart (). Getallexclude ()); } @Bean public hateoasobjenesissisablabler hateoasobjenesissiscachedisabler () {return New hateoasobjenesiscachedisabler (); } @Bean public FileSystemWatcherFactory FileSystemWatcherFactory () {Neue DateiSystemWatcherFactory () {@Override public FileSystemWatcher getFileSystemWatcher () {return newFilesystemWatcher (); }}; } private fileSystemWatcher newFileSystemWatcher () {restart restartProperties = this.properties.getRestart (); DateiSystemWatcher Watcher = new FileSystemWatcher (true, restartProperties.getPollInterval (), restartProperties.getQuietperiod ()); String TriggerFile = restartProperties.getTriiggerFile (); if (Stringutils.hasLength (TriggerFile)) {watcher.settriggerFilter (neuer TriggerFileFilter (TriggerFile)); } List <Datei> zusätzlichPaths = restartProperties.getadDitionalPaths (); für (Dateipfad: zusätzlichePaths) {watcher.addsourceFolder (path.getabsoluteFile ()); } Return Watcher; }}}Die gesamte Konfiguration gibt zurück, ob der entsprechende Watchservice registriert werden soll
Natürlich können wir auch das Glas entfernen
Es ist zu beachten, dass Sie beim Kommentieren dieses Code wieder wiederkommen müssen
MVN sauber
Andernfalls ist es möglicherweise nicht möglich, das Glas automatisch auszuschließen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.