arrière-plan
Springboot est de plus en plus utilisé par tout le monde pour réaliser un déploiement à chaud à l'aide de Springboot Devtool
La même classe CastException apparaît
analyser
Tout d'abord, déterminez si la CastException de la même classe apparaît, par exemple, car le Classloader est différent.
La question de savoir si une classe est la même dépend de deux facteurs
C'est-à-dire que la classe expliquée par différents chargeurs de classe est une classe différente
Utilisation courante de JDBC lorsque nous apprenons
/ ** * Renvoie l'objet {@code classe} associé à la classe ou * interface avec le nom de chaîne donné. L'invocation de cette méthode est * équivalente à: * * <blockQuote> * {@code class.forname (className, true, currentloader)} * </lockquote> * où {@code currentLoader} désigne le chargeur de classe de définition de * la classe actuelle. * * <p> par exemple, le fragment de code suivant renvoie le descripteur * runtime {@code} pour la classe nommée * {@code java.lang.thread}: * * <lockquote> * {@code class t = class.forname ("java.lang.thread") forname ("x")} fait que la classe nommée * {@code x} est initialisée. * * @param className le nom entièrement qualifié de la classe souhaitée. * @return l'objet {@code classe} pour la classe avec le nom * spécifié. * @Exception LinkageError Si le lien échoue * @Exception ExceptionIninitializerError si l'initialisation provoquée * par cette méthode échoue * @Exception classNotFoundException si la classe ne peut pas être localisée * / public static class <?> forname (String classname) lance classnotfoundException {return forname (classname, true, classloader.getCallerClass)À partir de ce qui précède, nous pouvons comprendre que les mêmes classes expliquées par différents chargeurs de classe ne peuvent pas se convertir.
De cette façon, nous ciblons Devtools.
Nous avons introduit les dépendances suivantes à Springboot
<dependency> <proupId> org.springframework.boot </proupyId> <ArtifActid> printemps-boot-devtools </ artifactive> <Apultal> true </acultieal> </Dependency>
Alors, comment exclure les dépendances de Devtool?
Ajouter une application.properties
printemps.devtools.restart.enabled = false
J'ai découvert que la maine redémarrée utilisée peut encore être vue lors du démarrage
2018-03-19 22: 04: 37.641 Info 53428 --- [Restartedmain] swsmmarequestmappinghandleradapter: à la recherche de @ControlleRaDvice: org.springframework.boot.context.embedded.annotationconfigemeddedwebapplicationcontext@7443f7a3: startrup Date [mon mar 19 22:03:34 CST 2018]; Racine de la hiérarchie du contexte
2018-03-19 22: 04: 37.654 Info 53428 --- [Restartedmain] swsmmarequestmappinghandleradapter: détecté réponse haricot dans org.springframework.boot.actuate.AutoConfigure.endpointwebmvchypermediationConfiguration $ ActAlatinc
2018-03-19 22: 04: 37.956 Info 53428 --- [Restartedmain] Oswshandler.simpleurlLerMapping: Mapted URL Path [/wagger-ui.html] sur le gestionnaire de type [classe org.springframework.web.servlet.Resource.ResourceHtTprequesthandler]
2018-03-19 22: 04: 37.956 Info 53428 --- [Restartedmain] Oswshandler.simpleurlHandlermapping
Pourquoi le thread nommé Restartedmain Set Spring.devtools.Restart.Enabled Invalid est-il invalide?
Code
ApplicationListener est utilisé dans le package correspondant à Devtools
private void onApplicationStartingEvent (applicationStartingEvent Event) {// Il est trop tôt pour utiliser l'environnement de ressort, mais nous devons toujours permettre aux utilisateurs de désactiver le redémarrage à l'aide d'une propriété système. String actived = System.getProperty (ENabled_Property); if (activé == null || boolean.parseboolean (activé)) {String [] args = event.getArgs (); DefaulTrestartinitializer initializer = new DefaulTrestartinitializer (); Boolean restartonInitialize =! AGENTRELOADER.ISACTIVE (); Restarter.Initialize (args, false, initialiseur, re-startoninitialialialize); } else {restarter.disable (); }}Il est évident que le restaurant est réellement lu à partir des variables système plutôt que dans l'environnement de ressort. Comme le dit le commentaire, il est en fait trop tôt pour utiliser la propriété Spring en ce moment.
Par conséquent, les variables système peuvent être utilisées
Par conséquent, nous pouvons utiliser les paramètres JVM
-Dspring.devtools.restart.enabled = false
Effectivement, tout va bien pour le moment
2018-03-19 22: 18: 12.928 Info 66260 --- [Main] com.f6car.base.Application: Les profils suivants sont actifs: Dev
2018-03-19 22: 18: 13.131 Info 66260 --- [Main] AtionConfigeMeddedWebApplicationContext: Rafraîchissement org.springframework.boot.context.embedded.annotationconfigembeddedwebapplicationcontext@2a4354cb: startep date [mon mar 192:18:13 CSt 2018]; Racine de la hiérarchie du contexte
Alors, quel est le but de la configuration dans le fichier de configuration de Spring?
/ ** * Redémarrer les propriétés. * / public static class redémarrer {private static final string default_restart_excludes = "meta-inf / maven / **," + "meta-inf / ressources / **, ressources / **, statique / **, public / **, modèles / **," + "** / * test.class, ** / * tests.class, git.properties, meta-inf / build-info.properties"; Private Static Final Long Default_Restart_Poll_Interval = 1000; Private Static Final Long Default_RESTART_QUIET_PERIOD = 400; / ** * Activer le redémarrage automatique. * / Boolean privé activé = true; / ** * Modèles qui doivent être exclus du déclenchement d'un redémarrage complet. * / String privé exclude = default_restart_excludes; / ** * Modèles supplémentaires qui doivent être exclus du déclenchement d'un redémarrage complet. * / String privé AdditionAlexClude; / ** * du temps (en millions de secondes) pour attendre entre le scrutin des changements de chemin de classe. * / private long polinterval = default_restart_poll_interval; / ** * du temps de calme (en millions de secondes) requis sans aucun changement de chemin de classe * avant qu'un redémarrage ne soit déclenché. * / private long QuietPeriod = default_restart_quiet_period; / ** * Nom d'un fichier spécifique qui, une fois modifié, déclenchera la vérification du redémarrage. Si * non spécifié, un changement de fichier ClassPath déclenchera le redémarrage. * / Private String TriggerFile; / ** * chemins supplémentaires pour surveiller les modifications. * / Liste privée <Fichier> AdditionalPaths = new ArrayList <Fichier> (); public boolean iseNabled () {return this.enabled; } public void setenableable (boolean activé) {this.enabled = activé; }À partir du code, il semble être utilisé pour configurer si l'écoute peut être redémarrée automatiquement
/ ** * Configuration de redémarrage local. * / @ConditionalonProperty (prefix = "spring.devtools.restart", name = "activé", matchIFMissing = true) statique randonifiguration {@autowired private DevtoolSproperties Properties; @EventListener public void onClassPathChanged (événement ClassPathChangeDevent) {if (event.isRestArtRequired ()) {restarter.getInstance (). Restart (new FileWatchingFailureHandler (FileSystemWatherFactory ())); }} @Bean @conditionalonMissingBean public classpathfilesystemwatcher classpathfilesystemwatcher () {url [] urls = restarter.getInstance (). GetInitiArls (); CLASSPATHFILESYSTEMWATCHER Watcher = new ClassPathFileSystemWatcher (FileSystemWatherFactory (), ClassPathrestartStrategy (), URLS); watcher.setStopWatherOnRestart (true); Retour Watcher; } @Bean @conditionalonMissingBean public classpathrestartStrategy classpathrestartStrategy () {return new PatternClassPathRestartStrategy (this.properties.getRestart (). Getallexclude ()); } @Bean public hateoasobjeneseiscachedisabler hateoasobjeneseiscachedisabler () {return new hateoasobjeneseisachedisabler (); } @Bean public FileSystemWatherFactory FileSystemWatherFactory () {return new FileSystemWatherFactory () {@Override public FileSystemWatcher getFileSystemWatcher () {return newFileSystemWatcher (); }}; } Private FileSystemWatcher newFileSystemWatcher () {restart restartProperties = this.properties.getRestart (); FileSystemWatcher Watcher = new FileSystemWatcher (true, restartProperties.getPollInterval (), restartProperties.getQuietperriod ()); String TriggerFile = restartProperties.getTriggerFile (); if (stringUtils.hasLength (TriggerFile)) {watcher.setTriggerFilter (new TriggerFileFilter (TriggerFile)); } List <Fichier> supplémentairePaths = restartProperties.getAdditionalPaths (); pour (chemin de fichier: AdditionalPaths) {watcher.addsourcefolder (path.getAbsoluteFile ()); } return watcher; }}}L'ensemble de la configuration renvoie s'il faut enregistrer le service d'observation correspondant
Bien sûr, nous pouvons également retirer le pot
Il convient de noter que lors de commentaire ce code, vous devez
MVN Clean
Sinon, il peut ne pas être possible d'exclure automatiquement le pot
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.