SpringBoot 의 reload 로 더 방법
10204 단어 SpringBoot로 더
spring boot 가 점점 더 많이 사용 되 고 있 습 니 다SpringBoot DevTool 열 배치 실현
같은 종류의 castException 이 나 타 났 습 니 다.
분석 하 다.
우선 같은 종류의 castException 이 나타 나 는 것 을 확인 합 니 다.예 를 들 어 classloader 가 다 르 기 때 문 입 니 다.
하나의 class 가 같은 지 여 부 는 두 가지 요소 에 달 려 있다.
classloader same클래스 파일 이 같 습 니 다.
즉,서로 다른 classloader 가 설명 한 class 는 서로 다른 class 입 니 다.
저희 가 jdbc 를 배 울 때 자주 사용 하 는 것 같 아 요.
/**
* Returns the {@code Class} object associated with the class or
* interface with the given string name. Invoking this method is
* equivalent to:
*
* <blockquote>
* {@code Class.forName(className, true, currentLoader)}
* </blockquote>
*
* where {@code currentLoader} denotes the defining class loader of
* the current class.
*
* <p> For example, the following code fragment returns the
* runtime {@code Class} descriptor for the class named
* {@code java.lang.Thread}:
*
* <blockquote>
* {@code Class t = Class.forName("java.lang.Thread")}
* </blockquote>
* <p>
* A call to {@code forName("X")} causes the class named
* {@code X} to be initialized.
*
* @param className the fully qualified name of the desired class.
* @return the {@code Class} object for the class with the
* specified name.
* @exception LinkageError if the linkage fails
* @exception ExceptionInInitializerError if the initialization provoked
* by this method fails
* @exception ClassNotFoundException if the class cannot be located
*/
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className, true, ClassLoader.getCallerClassLoader());
}
위 에서 우 리 는 서로 다른 classloader 가 설명 한 똑 같은 class 도 서로 바 꿀 수 없다 는 것 을 알 수 있다.이렇게 해서 우 리 는 목 표를 devtools 에 두 었 다.
우 리 는 springboot 에서 다음 과 같은 의존 도 를 도입 했다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
그렇다면 devtool 의 의존 을 어떻게 제거 합 니까?application.properties 에 추가
spring.devtools.restart.enabled=false
시작 할 때 사용 하 는 restartedMain 을 볼 수 있 습 니 다.2018-03-19 22:04:37.641 INFO 53428 --- [restartedMain] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7443f7a3 : startup date [Mon Mar 19 22:03:34 CST 2018]; root of context hierarchy
2018-03-19 22:04:37.654 INFO 53428 --- [restartedMain] s.w.s.m.m.a.RequestMappingHandlerAdapter : Detected ResponseBodyAdvice bean in org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration$ActuatorEndpointLinksAdvice
2018-03-19 22:04:37.956 INFO 53428 --- [restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/swagger-ui.html] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-19 22:04:37.956 INFO 53428 --- [restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping
이 스 레 드 이름 은 restarted Main 인 데 왜 spring.devtools.restart.enabled 가 잘못 되 었 습 니까?
코드
devtools 패키지 에 applicationListener 를 사 용 했 습 니 다.
private void onApplicationStartingEvent(ApplicationStartingEvent event) {
// It's too early to use the Spring environment but we should still allow
// users to disable restart using a System property.
String enabled = System.getProperty(ENABLED_PROPERTY);
if (enabled == null || Boolean.parseBoolean(enabled)) {
String[] args = event.getArgs();
DefaultRestartInitializer initializer = new DefaultRestartInitializer();
boolean restartOnInitialize = !AgentReloader.isActive();
Restarter.initialize(args, false, initializer, restartOnInitialize);
}
else {
Restarter.disable();
}
}
분명히 restarter 의 시작 은 시스템 변수 에서 읽 는 것 이지 spring 환경 에서 읽 는 것 이 아 닙 니 다.따라서 시스템 변 수 를 사용 할 수 있 습 니 다.
따라서 우 리 는 jvm 인 자 를 사용 할 수 있다.
-Dspring.devtools.restart.enabled=false
역시 이때 모든 게 OK.2018-03-19 22:18:12.928 INFO 66260 --- [main] com.f6car.base.Application : The following profiles are active: dev
2018-03-19 22:18:13.131 INFO 66260 --- [main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@2a4354cb : startup date [Mon Mar 19 22:18:13 CST 2018]; root of context hierarchy
그럼 Spring 프로필 에 설정 한 목적 은 무엇 입 니까?
/**
* Restart properties.
*/
public static class Restart {
private static final String DEFAULT_RESTART_EXCLUDES = "META-INF/maven/**,"
+ "META-INF/resources/**,resources/**,static/**,public/**,templates/**,"
+ "**/*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;
/**
* Enable automatic restart.
*/
private boolean enabled = true;
/**
* Patterns that should be excluded from triggering a full restart.
*/
private String exclude = DEFAULT_RESTART_EXCLUDES;
/**
* Additional patterns that should be excluded from triggering a full restart.
*/
private String additionalExclude;
/**
* Amount of time (in milliseconds) to wait between polling for classpath changes.
*/
private long pollInterval = DEFAULT_RESTART_POLL_INTERVAL;
/**
* Amount of quiet time (in milliseconds) required without any classpath changes
* before a restart is triggered.
*/
private long quietPeriod = DEFAULT_RESTART_QUIET_PERIOD;
/**
* Name of a specific file that when changed will trigger the restart check. If
* not specified any classpath file change will trigger the restart.
*/
private String triggerFile;
/**
* Additional paths to watch for changes.
*/
private List<File> additionalPaths = new ArrayList<File>();
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
코드 에서 보 니 감청 여 부 를 설정 하 는 데 사용 되 는 것 같 습 니 다.
/**
* Local Restart Configuration.
*/
@ConditionalOnProperty(prefix = "spring.devtools.restart", name = "enabled", matchIfMissing = true)
static class RestartConfiguration {
@Autowired
private DevToolsProperties properties;
@EventListener
public void onClassPathChanged(ClassPathChangedEvent event) {
if (event.isRestartRequired()) {
Restarter.getInstance().restart(
new FileWatchingFailureHandler(fileSystemWatcherFactory()));
}
}
@Bean
@ConditionalOnMissingBean
public ClassPathFileSystemWatcher classPathFileSystemWatcher() {
URL[] urls = Restarter.getInstance().getInitialUrls();
ClassPathFileSystemWatcher watcher = new ClassPathFileSystemWatcher(
fileSystemWatcherFactory(), classPathRestartStrategy(), urls);
watcher.setStopWatcherOnRestart(true);
return watcher;
}
@Bean
@ConditionalOnMissingBean
public 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 getFileSystemWatcher() {
return newFileSystemWatcher();
}
};
}
private FileSystemWatcher newFileSystemWatcher() {
Restart restartProperties = this.properties.getRestart();
FileSystemWatcher watcher = new FileSystemWatcher(true,
restartProperties.getPollInterval(),
restartProperties.getQuietPeriod());
String triggerFile = restartProperties.getTriggerFile();
if (StringUtils.hasLength(triggerFile)) {
watcher.setTriggerFilter(new TriggerFileFilter(triggerFile));
}
List<File> additionalPaths = restartProperties.getAdditionalPaths();
for (File path : additionalPaths) {
watcher.addSourceFolder(path.getAbsoluteFile());
}
return watcher;
}
}
}
전체 설정 에 따라 해당 하 는 watchService 등록 여 부 를 되 돌려 줍 니 다.물론 저희 도 이 jar 를 제거 할 수 있 습 니 다.
주의해 야 할 것 은 이 코드 를 주석 할 때 다시 해 야 한 다 는 것 이다.
mvn clean
그렇지 않 으 면 이 jar 를 자동 으로 제거 할 수 없 을 수도 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.