fundo
O Springboot está sendo cada vez mais usado por todos para obter uma implantação quente usando o Springboot Devtool
A mesma classe CastException aparece
analisar
Primeiro, determine se a CastException da mesma classe aparece, por exemplo, porque o carregador de classe é diferente.
Se uma classe é a mesma depende de dois fatores
Isto é, a classe explicada por diferentes carregadores de classe é uma classe diferente
Uso comum do JDBC quando aprendemos
/** * Retorna o objeto {@code class} associado à classe ou * interface com o nome da string fornecida. Invocar este método é * equivalente a: * * <lockQuote> * {@code class.ForName (ClassName, True, CurrentLoader)} * </lockQuote> * onde {@code CurrentLoader} indica o carregador de definição da * a classe atual. * * <p> Por exemplo, o seguinte fragmento de código retorna o descritor * RUNTIME {@CODE Class} para a classe denominada * {@code java.lang.thread}: * * <lockQuote> * {@code classe t = class.forname ("java.lang.Thread")} * <//blockquthet> * <loca -" * * * </bloquear) faz com que a classe nomeada * {@code x} seja inicializada. * * @param ClassName O nome totalmente qualificado da classe desejada. * @return O objeto {@code class} para a classe com o nome * especificado. * @Exception LinkageError Se a ligação falhar * @Exception ExceptionInInitializerError Se a inicialização provocada * por esse método falha * @Exception ClassNotFoundException Se a classe não puder ser localizada */public static Class <?> forName (string className) throws ClassNOTFoundException {ReturnTame0;Do exposto, podemos entender que as mesmas classes explicadas por diferentes carregadores de classe não podem se converter.
Dessa maneira, visamos Devtools.
Introduzimos as seguintes dependências no Springboot
<Depencency> <PuerpId> org.springframework.boot </frugid> <stifactId> spring-boot-devtools </stutifactId> <cptional> true </cptional> </pendendence>
Então, como excluir as dependências do Devtool?
Adicione o Application.Properties
spring.devtools.restart.enabled = false
Descobri que o reiniciado usado ainda pode ser visto ao iniciar
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]; raiz da hierarquia de contexto
2018-03-19 22:04:37.654 INFO 53428 --- [restartedMain] swsmmaRequestMappingHandlerAdapter : Detected ResponseBodyAdvice bean in org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration$ActuatorEndpointLinksAdvice
2018-03-19 22: 04: 37.956 INFO 53428 --- [RESTARDMAIN] Oswsshandler.simplexHandleMapping: Caminho do URL mapeado [/swagger-ui.html] no manipulador de tipo [classe org.springFramework.web.rlettlet.Rescerce.Rescerces.Rescerces.Rescersces.Resrerces.Resrerces.
2018-03-19 22: 04: 37.956 INFO 53428 --- [RESTARDMAIN] Oswshandler.SimplexErlHandlerMapping
Por que o thread chamado RestartedMain está definido spring.devtools.restart.enabled inválido?
Código
ApplicationListener é usado no pacote correspondente a Devtools
Void privado OnApplicationStartingEvent (Evento ApplicationStartingEvent) {// É muito cedo para usar o ambiente de primavera, mas ainda devemos permitir que // os usuários desativem o reinício usando uma propriedade do sistema. String Habiled = System.getProperty (Enabled_property); if (habilitado == null || boolean.parseboolean (ativado)) {string [] args = event.getargs (); Initializador de AFAULTRASTARTILITALIZER = new DefaulTrestartinitializer (); Boolean rewtoninitialize =! agentReloader.isactive (); RESTARTER.Initialize (args, falso, inicializador, Restartoninitialize); } else {restatarter.disable (); }}É óbvio que o restaurante é realmente lido das variáveis do sistema, e não do ambiente de primavera. Como diz o comentário, é realmente muito cedo para usar a propriedade da primavera neste momento.
Portanto, as variáveis do sistema podem ser usadas
Portanto, podemos usar parâmetros de JVM
-Dspring.devtools.restart.enabled = false
Com certeza, está tudo bem neste momento
2018-03-19 22: 18: 12.928 Info 66260 --- [Main] com.f6car.base.application: Os seguintes perfis são ativos: Dev: Dev
2018-03-19 22: 18: 13.131 INFO 66260 --- [PRINCIPAL] ATIONCONFIGEMBEDDEDWEBAPPLICATIONCONTEXT: refrescante org.springframework.boot.context.embedded.annotationConfigEmbedwUppApplicationContext@2A434444444444444444444444444444444444442 raiz da hierarquia de contexto
Então, qual é o objetivo da configuração no arquivo de configuração da primavera?
/*** Reinicie as propriedades. */Classe estática pública Reiniciar {private Static Final String Default_restart_excludes = "meta-inf/maven/**," + "meta-inf/resource "**/*test.class, **/*tests.class, git.properties, meta-inf/build-info.properties"; private estático final longo default_restart_poll_interval = 1000; private estático final long default_restart_quiet_period = 400; /*** Ativar reinicialização automática. */ booleano privado ativado = true; /*** Padrões que devem ser excluídos de desencadear uma reinicialização completa. */ private string exclude = default_restart_excludes; /*** Padrões adicionais que devem ser excluídos de desencadear uma reinicialização completa. */ String privada adicionalExclude; /*** quantidade de tempo (em milhões de segundos) para esperar entre as pesquisas por mudanças de patrimônio de classe. */ PollInterval de longa data privada = default_restart_poll_interval; /** * Quantidade de tempo de silêncio (em milhões de segundos) necessário sem nenhuma alteração no caminho de classe * antes que um reinício seja acionado. */ privado longo silencioso = default_restart_quiet_period; /*** Nome de um arquivo específico que, quando alterado, acionará a verificação de reinicialização. Se * não especificado, qualquer alteração do arquivo de patê de classe acionará o reinício. */ Private String Triggerfile; /*** Caminhos adicionais a serem observados por alterações. */ Lista privada <File> adicionalPaths = new ArrayList <File> (); public boolean isEnabled () {return this.enabled; } public void setEnabled (boolean habilitado) {this.enabled = Enabled; }Do código, parece ser usado para configurar se a escuta pode ser reiniciada automaticamente
/*** Configuração de reinicialização local. */ @ConditionalOnProperty (prefix = "spring.devtools.restart", name = "habilitado", matchifmissing = true) Classe estática RESTARTCONFIGURAÇÃO {@AUTOWIRED PRIVRADAS DEVTOOLSPROPERTIES; @EventListener public void OnClassPathChanged (Evento da ClassPhanGEDEDEvent) {if (event.isrestarTequired ()) {restatarter.getInstance (). Reiniciar (new FileWatchingFailureHandler (fileSystemwatcherFactory ()); }} @Bean @ConditionalonMissingBean ClassPathFilesystemwatcher ClassPhilesystemwatcher () {url [] urls = restatar.getInstance (). Getinitialurls (); ClassPathFilesystemWatcher Watcher = new ClassPathFilesystemWatcher (filesystemwatcherFactory (), ClassPathRarTStrategy (), URLs); watchter.setStopWatcheRonRestart (true); Retornar observador; } @Bean @ConditionalonMissingBean ClassPathRestartStrategy ClassPathRestartStrategy () {Return new PatternClassPathRestartStrategy (this.properties.getRestart (). GetallexClude ()); } @Bean Public HateoasObJenesCachedisable HateoasobJenesiscachedisabler () {Retorne novo hateoasobjenesiscachedisabler (); } @Bean Public FileSystemWatcherFactory FileSystemWatcherFactory () {Return New FileSystemWatcherFactory () {@Override public FileSystemWatcher getFilesystemwatcher () {return newFilesystemWatcher (); }}; } Private FileSystemWatcher newFilesystemwatcher () {reiniciar reinictRoperties = this.properties.getRestart (); FileSystemWatcher Watcher = new FileSystemwatcher (true, renderttoperties.getPollInterval (), rendertProperties.getquietperiod ()); String triggerfile = rewertProperties.getTriggerfile (); if (stringUtils.haslength (triggerfile)) {watchger.SetTriggerFilter (novo triggerfileFilter (triggerfile)); } List <File> adicionalPaths = rewertProperties.getAdditionalPaths (); para (Caminho do arquivo: ADDERCTION) {Watcher.addsourceFolder (path.getabsolutefile ()); } retornar observador; }}}Toda a configuração retorna se deve registrar o serviço de relógios correspondente
Claro que também podemos remover o frasco
Deve-se notar que, ao comentar este código, você precisa re-
MVN Limpo
Caso contrário, pode não ser possível excluir automaticamente o frasco
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.