배경
SpringBoot DevTool을 사용하여 핫 배포를 달성하기 위해 모든 사람이 점점 더 많이 사용하고 있습니다.
동일한 클래스 CastException이 나타납니다
분석
먼저, 클래스 로더가 다르기 때문에 동일한 클래스의 CastException이 나타나는지 여부를 결정하십시오.
클래스가 동일한지 여부는 두 가지 요소에 따라 다릅니다.
즉, 다른 클래스 로더가 설명한 클래스는 다른 클래스입니다.
우리가 배울 때 JDBC의 일반적인 사용
/** * 클래스와 관련된 {@code class} 개체를 반환하거나 주어진 문자열 이름과 * 인터페이스를 반환합니다. 이 메소드를 호출하는 것은 * * * <blockquote> * {@code class.forname (className, true, currentLoader)} * </blockquote> *와 동일합니다. 예를 들어, 다음 코드 조각은 * {@code java.lang.thread} : * * <blockquote> * {@code class t = class.forname ( "java.lang.thread") * </blockquote> * * a Call to and a Conge to a Call to and a Call to a Call. * {@code x}라는 클래스가 초기화됩니다. * * * @param className 원하는 클래스의 자격을 갖춘 완전히 이름입니다. * @지정된 이름을 가진 클래스의 {@code class} 개체를 return. * @exception linkageError 연결이 실패하면 * @Exception ExceptionInItializerERROR이 메소드에 의해 초기화가 유발 된 경우 * @Except ClassNameception (String ClassName)이 ClassNotFoundException {Classloader.get, ClassLoader.getCallclassLoxection {return forname0 (className, return))위에서 우리는 다른 클래스 로더가 설명한 동일한 클래스가 서로 변환 할 수 없다는 것을 이해할 수 있습니다.
이런 식으로 우리는 DevTools를 목표로합니다.
SpringBoot에서 다음의 종속성을 소개했습니다
<pectionency> <groupId> org.springframework.boot </groupid> <artifactid> Spring-Boot-DevTools </artifactid> <selection> true </옵션> </fectionency>
그렇다면 DevTool의 종속성을 제외하는 방법은 무엇입니까?
Application.Properties를 추가하십시오
spring.devtools.restart.enabled = false
시작할 때 사용 된 재시작 된 메인이 여전히 볼 수 있음을 알았습니다.
2018-03-19 22 : 04 : 37.641 정보 53428 --- [RETARTEDMAIN] SWSMMAREQUESTMAPPINGHANDLERADAPTER : @ControllEradVice : org.springframewort.boot.context.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded.embedded. 22:03:34 CST 2018]; 컨텍스트 계층 구조의 근본
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 --- [RETARTEDMAIN] OSWSHANDLER.SIMPLEURLHANDLERMPAPP : MAPPED URL 경로 [/wagger-ui.html] 유형의 핸들러에 대한 [class org.springframework.weesterchhhhtprecce.resource.resourcehhhhttweSource.resourcehhhttweSource.resourcehhhtwhtwhtwhtander]
2018-03-19 22 : 04 : 37.956 정보 53428 --- [RETARTEDMAIN] OSWSHANDLER.SIMPLEURLHANDLERMPAPP
RETARTEDMAIN이라는 스레드가 Spring.devTools.restart.enabled가 잘못된 이유는 무엇입니까?
암호
ApplicationListener는 DevTools에 해당하는 패키지에 사용됩니다
private void onapplicationStartingEvent (ApplicationStartingEvent 이벤트) {// 스프링 환경을 사용하기에는 너무 이르지만 // 사용자가 시스템 속성을 사용하여 다시 시작 할 수 있도록 허용해야합니다. 문자열 enabled = system.getProperty (enabled_property); if (enabled == null || boolean.parseboolean (enabled)) {string [] args = event.getargs (); defaultRestArtInitializer Initializer = new defaultRestArtInitializer (); 부울 재시작 =! agentreloader.isActive (); restarter.initialize (Args, False, Initializer, RootartonInitialize); } else {restarter.disable (); }}RESTARTER는 실제로 스프링 환경이 아닌 시스템 변수에서 읽는 것이 분명합니다. 의견에서 알 수 있듯이이 순간 스프링 속성을 사용하기에는 실제로 너무 이르다.
따라서 시스템 변수를 사용할 수 있습니다
따라서 JVM 매개 변수를 사용할 수 있습니다
-dspring.devtools.restart.enabled = false
물론, 지금은 모든 것이 괜찮습니다
2018-03-19 22 : 18 : 12.928 정보 66260 --- [main] com.f6car.base.application : 다음 프로파일이 활성화되어 있습니다 : dev
2018-03-19 22 : 18 : 13.131 정보 66260 --- [Main] AttionConfigemeddedWebApplicationContext : 새로 고침 org.sprameframework.boot.context.embedded.annotationConfidededwebapplicationContext@2A4354CB : Startup Date [Mon MAR 19:18:18:18]; 컨텍스트 계층 구조의 근본
그렇다면 Spring의 구성 파일에서 구성의 목적은 무엇입니까?
/*** 속성을 다시 시작합니다. */public static 클래스 재시작 {private static final String default_restart_excludes = "meta-inf/maven/**," + "meta-inf/resources/**, static/**, public/**, 템플릿/**," + "**/*test.class, **/*tests.class, git.properties, meta-inf/build-info.properties"; 개인 정적 최종 최종 긴 기본 _restart_poll_interval = 1000; 개인 정적 최종 최종 긴 기본 _restart_quiet_period = 400; /*** 자동 재시작 활성화. */ private boolean enabled = true; /*** 전체 재시작을 트리거하여 제외 해야하는 패턴. */ private string exclude = default_restart_excludes; /*** 전체 재시작 트리거에서 제외 해야하는 추가 패턴. */ 개인 문자열 additeAlexClude; /*** 클래스 경로 변경을 위해 폴링 사이에 기다리는 시간 (백만 초). */ private long pollinterval = default_restart_poll_interval; /** * 클래스 경로 변경없이 필요한 조용한 시간 (백만 초) * 재시작이 트리거되기 전에 *. */ private long QuietPeriod = default_restart_quiet_period; /*** 변경시 다시 시작 확인이 트리거되는 특정 파일의 이름. * 지정되지 않은 경우 클래스 경로 파일 변경은 다시 시작됩니다. */ 개인 문자열 트리거 파일; /*** 변경 사항을 감시하는 추가 경로. */ private list <file> 추가 경로 = 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) 정적 클래스 RPartConfiguration {@autowired private devtoolsproperties 속성; @eventListener public void onclassPathChanged (classPathChangeDevent event) {if (event.isRestArtRequired ()) {restarter.getInstance (). Restart (new FileWatchingFailureHandler (fileSystemWatcherFactory ()); }} @bean @bean @bean @conditionalonmissingbean public classpitpilesystemwatcher classpathfilesystemWatcher () {url [] urls = restarter.getInstance (). getInitialUrls (); ClassPathFilesystemWatcher Watcher = New ClassPathFilesystemWatcher (FileSystemWatcherFactory (), ClassPathRestArtStrategy (), URL); Watcher.SetStopWatcheronRestart (True); 리턴 감시자; } @bean @bean @conditionalonmissingbean public classpathrestartrategy classPathRestartStrategy () {return new PatternClassPathRestArtStrategy (this.properties.getRestart (). getAllexClude ()); . } @bean public filesystemwatcherFactory filesystemWatcherFactory () {return new filesystemWatcherFactory () {@Override public filesystemWatcher getFilesyStemWatcher () {return newFilesyStemWatcher (); }}; } private filesystemWatcher NewFilesyStemWatcher () {다시 시작 REPARTPROPERTIES = this.Properties.getRestart (); FileSystemWatcher Watcher = 새로운 FileSystemWatcher (true, rellartProperties.getPollInterVal (), RETARTProperTies.getQuietPeriod ()); String triggerfile = REPARTPROPERTIES.GETTRIGGERFILE (); if (stringUtil.haslength (triggerfile)) {watcher.settriggerfilter (new triggerfilefilter (triggerfile)); } list <file> 추가 경로 = REPARTPROPERTIES.GETADDITIONALPATHS (); for (파일 경로 : 추가 경로) {watcher.addsourcefolder (path.getabsolutefile ()); } 리턴 감시자; }}}전체 구성은 해당 WatchService 등록 여부를 반환합니다.
물론 항아리를 제거 할 수도 있습니다
이 코드를 댓글을 달 때 다시 말해야합니다.
MVN 청소
그렇지 않으면 항아리를 자동으로 제외 할 수 없습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.