fondo
SpringBoot es cada vez más utilizado por todos para lograr la implementación en caliente utilizando SpringBoot DevTool
Aparece la misma clase CastException
analizar
Primero, determine si la CastException de la misma clase aparece, por ejemplo, porque el cargador de clases es diferente.
Si una clase es la misma depende de dos factores
Es decir, la clase explicada por diferentes cargadores de clases es una clase diferente
Uso común de JDBC cuando aprendemos
/** * Devuelve el objeto {@code class} asociado con la clase o * interfaz con el nombre de cadena dado. Invocar este método es * equivalente a: * * <LockQuote> * {@code class.forname (className, true, currentLoader)} * </blockquote> * Where {@code curtentLoader} denota el cargador de clase definitorio de * la clase actual. * * <p> Por ejemplo, el siguiente fragmento de código devuelve el descriptor * runtime {@code class} para la clase llamada * {@code java.lang.thread}: * * <Blockquote> * {@code class t = class.forname Hace que la clase llamada * {@code x} se inicialice. * * @param classname El nombre totalmente calificado de la clase deseada. * @return el objeto {@code class} para la clase con el nombre * especificado. * @Exception LinkageError Si el enlace falla * @Exception ExceptionInInitializerError Si la inicialización provocada * por este método falla * @Exception classNotFoundException si la clase no se puede ubicar */public static class <?> FORNAME (String className) lanza classNotFoundException {returnname0 (className, verdadero, classLoader.LoaderCallerCallerClaScle ();)De lo anterior podemos entender que las mismas clases explicadas por diferentes cargadores de clases no pueden convertirse entre sí.
De esta manera nos dirigimos a DevTools.
Hemos introducido las siguientes dependencias en Springboot
<Spendency> <ProupId> org.springframework.boot </groupid> <artifactid> spring-boot-devlools </arfactid> <pectional> true </pectional> </dependence>
Entonces, ¿cómo excluir las dependencias de DevTool?
Agregar en Application.Properties
spring.devtools.restart.enabled = falso
Descubrí que el reinicio que se usa todavía se puede ver al comenzar
2018-03-19 22: 04: 37.641 Información 53428 --- [reinicedMain] SWSMMareQuestMappingHandlerAdapter: Buscando @ControllerAdvice: org.springframework.boot.context.embededed.annotationConfigembedDedwebappaplationContext@7443f7a3: startups datil 22:03:34 CST 2018]; raíz de la jerarquía de contexto
2018-03-19 22: 04: 37.654 INFO 53428 --- [reinicedMain] SWSMMAREQUESTMAPPingHandLerAdapter: ResponderBodyAdvice Bean en org.springframeWork.boot.actuate.autoconfigure.endpointWebmvChypermediaManemageContextiveReTeStentExtiMenation $ ActuatorendEldinToPointEntectlinterEntEntEnteSeTeSE
2018-03-19 22: 04: 37.956 Información 53428 --- [reinicedMain] Oswshandler.Simpleurlhandlermapping: ruta de URL mapeada [/swagger-ui.html] en el manejo de type [class org.springframwork.web.ervlet.resource.resourcehttpreReShandler]
2018-03-19 22: 04: 37.956 Información 53428 --- [reinicedMain] Oswshandler.Simpleurlhandlermapping
¿Por qué el hilo llamado reinicedmain set spring.devtools.restart.enabled inválido?
Código
ApplicationListener se utiliza en el paquete correspondiente a DevTools
Private void onApplicationStartingEvent (evento AplicationStartingEvent) {// Es demasiado temprano para usar el entorno de resorte, pero aún debemos permitir // los usuarios deshabilitar reiniciar utilizando una propiedad del sistema. String habilitado = system.getProperty (Endabled_Property); if (habilitado == null || boolean.parseboolean (habilitado)) {string [] args = event.getArgs (); DeFaulTRESTARTIATIATIZATOR inicializador = new DeFaulTRESTARTInitializer (); boolean reintertonInitialize =! AgentReloader.IsActive (); Restarter.initialize (args, falso, inicializador, reiniconinitialize); } else {raroRarter.disable (); }}Es obvio que el Restarter en realidad se lee de las variables del sistema en lugar de del entorno de primavera. Como dice el comentario, en realidad es demasiado temprano para usar la propiedad de primavera en este momento.
Por lo tanto, se pueden usar variables del sistema
Por lo tanto, podemos usar parámetros JVM
-Dspring.devtools.restart.enabled = falso
Efectivamente, todo está bien en este momento
2018-03-19 22: 18: 12.928 Información 66260 --- [Main] com.f6car.base.application: los siguientes perfiles están activos: Dev
2018-03-19 22: 18: 13.131 Información 66260 --- [principal] AtionConfigembleDedWebApplicationContext: Refreshing org.springframework.boot.context.embedded.annotationConfigembedDedWebapplicationContext@2a4354cb: startup [startup [mar 19 22:18:13 cst 2018:13 cst 2018]; raíz de la jerarquía de contexto
Entonces, ¿cuál es el propósito de la configuración en el archivo de configuración de Spring?
/*** Reiniciar propiedades. */public static class reinsart {private static final cadena default_restart_excludes = "meta -inf/maven/**," + "metainf/recursos/**, recursos/**, static/**, public/**, plantillas/**," + "**/*test.class, **/*tests.class, git.properties, meta -inf/build-info.properties"; Private estático final Long Default_RESTART_POLL_INTERVAL = 1000; Private static final Long Default_RESTART_QUIET_PERIOD = 400; /*** Habilitar reinicio automático. */ private boolean habilitado = true; /*** Patrones que deben excluirse de activar un reinicio completo. */ private String Exclute = default_restart_excludes; /*** Patrones adicionales que deben excluirse de activar un reinicio completo. */ private String AddentAlExClude; /*** Cantidad de tiempo (en millones de segundos) para esperar entre los cambios de la clase. */ Private Long Pollinterval = Default_RESTART_POLL_INTERVAL; /** * Cantidad de tiempo de silencio (en millones de segundos) requerido sin ningún cambio de clase * antes de que se active un reinicio. */ Private Long Quietperiod = default_restart_quiet_period; /*** Nombre de un archivo específico que, cuando se modifique, activará la verificación de reinicio. Si * no especificó algún cambio de archivo de classpath, activará el reinicio. */ Private String TriggerFile; /*** Rutas adicionales para observar los cambios. */ Lista privada <Sche> adicionalPaths = new ArrayList <ScheS> (); public boolean isEnabled () {return this.enabled; } public void setEnabled (boolean habilitado) {this.enabled = habilitado; }Desde el código, parece usarse para configurar si la escucha se puede reiniciar automáticamente
/*** Configuración de reinicio local. */ @Conditionalonproperty (prefix = "spring.devtools.restart", name = "habilitado", matchifMissing = true) reinicie de clase estática {@aUtowired private DevToolSproperties Propiedades; @EventListener public void onClassPathChanged (evento classpathChangeDevent) {if (event.isRestarTruquired ()) {rEvarter.getInstance (). Reiniciar (nuevo FileWatchingFailureHandler (filesystemWatcherFactory ())); }} @Bean @conditionAlonMissingBean ClasspathFilesystemWatcher classpathFilesystemWatcher () {url [] urls = rardoRter.getInstance (). GetInitialUrls (); ClassPathFileSystemWatcher Watcher = new ClassPathFileSystemWatcher (FileSystemWatcherFactory (), classpathReStartStrategy (), URLS); Watcher.SetStopWatcheronRestart (verdadero); RETURN VISIÓN; } @Bean @conditionAlonMissingBean ClassPathRestartStrategy classpathRestartStrategy () {return New PatternClassPathRestartStrategy (this.properties.getRestart (). GetAllexClude ()); } @Bean public HateOaSobjenesisCachedisabler HateoAsobjenesisCachedisabler () {return New HateOaSobjenesisCachedisabler (); } @Bean Public FileSystemWatcherFactory FileSystemWatcherFactory () {return New FileSystemWatcherFactory () {@Override Public FileSystemWatcher getFilesSystemWatcher () {return NewFileSystemWatcher (); }}; } private Files SystemWatcher NewFileSystemWatcher () {reiniciar reintProperties = this.properties.getRestart (); FileSystemWatcher Watcher = new FilesystemWatcher (true, reintProperties.getPollInterval (), reintProperties.getQuietperiod ()); String TriggerFile = reintProperties.getTriggerFile (); if (StringUtils.hasLength (TriggerFile)) {Watcher.SetTRiggerFilter (new TriggerFileFilter (TriggerFile)); } List <Sche> adicionalPaths = reintProperties.getAdDitionAlPaths (); para (ruta de archivo: adicionalPaths) {Watcher.addsourceFolder (Path.getAbSoluteFile ()); } return Watcher; }}}Toda la configuración devuelve si registra el servicio de watchService correspondiente
Por supuesto que también podemos quitar el frasco
Cabe señalar que al comentar este código, debe volver a
MVN limpio
De lo contrario, puede que no sea posible excluir automáticamente el frasco
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.