2015-12-03 2 views
0

IDE является идея, загрузочный проект Spring есть META-INF/spring-devtools.properties, содержаниеСпринг загрузки Devtools нагрузку в два раза класса и вызвать LinkageError

restart.include.dozer=/dozer-5.5.1.jar 

при запуске проекта броска ниже исключения

2015-12-03 12:02:49,491 [restartedMain] INFO org.dozer.DozerBeanMapper - Initializing a new instance of dozer bean mapper. 
2015-12-03 12:02:49,494 [restartedMain] WARN o.s.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dozerBeanMapper' defined in class path resource [com/foo/common/CommonConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.dozer.Mapper]: Factory method 'dozerBeanMapper' threw exception; nested exception is java.lang.LinkageError: loader constraint violation: loader (instance of org/springframework/boot/devtools/restart/classloader/RestartClassLoader) previously initiated loading for a different type with name "org/dozer/DozerBeanMapper" 
2015-12-03 12:02:49,517 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application startup failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dozerBeanMapper' defined in class path resource [com/foo/common/CommonConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.dozer.Mapper]: Factory method 'dozerBeanMapper' threw exception; nested exception is java.lang.LinkageError: loader constraint violation: loader (instance of org/springframework/boot/devtools/restart/classloader/RestartClassLoader) previously initiated loading for a different type with name "org/dozer/DozerBeanMapper" 
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE] 

Что странно, при запуске проекта в Eclipse нет проблем. Добавить -XX:+TraceClassLoading Конфигурация в идее, я обнаружил, что бульдозер загружается дважды.

9569 [Loaded org.dozer.DozerBeanMapper from file:/C:/Users/otto/.m2/repository/net/sf/dozer/dozer/5.5.1/dozer-5.5.1.jar] 

9618 [Loaded org.dozer.DozerBeanMapper from file:/C:/Users/otto/.m2/repository/net/sf/dozer/dozer/5.5.1/dozer-5.5.1.jar] 

Теперь я не знаю, как найти причину этой проблемы?

+0

Можете ли вы поделиться небольшим образцом, который воспроизводит проблему? –

+0

@ Энди Уилкинсон Привет, я создал образец минимализма - https: //gist.github.com/zhugw/63e98f99098156e8173a. Запустите FooAplication, вы можете сгенерировать эту ошибку. – zhuguowei

+0

Не могли бы вы направить настоящий проект в Git repo где-нибудь? Я хотел бы быть уверенным, что я выполняю _exactly_ тот же самый код, что и вы, и собирать его вместе из gist означает, что это может быть не так. –

ответ

0

Там какая-то важная информация в файле README проекта, что вы поделились, что не включены в вопросе: то

Скачать образец проекта импортировать этот проект Eclipse, замкнут, то бар проект запуска FooApplication вы можете получить ниже ошибка

Закрытие проекта панели означает, что его классы не будут допущены к перезапуску. Это означает, что они будут загружаться загрузчиком основного класса, а не загрузчиком класса перезапуска. Код в строке зависит от Dozer, но вы настроили DevTools так, что классы Dozer будет загружен класс рестарта загрузчика:

restart.include.dozer=/dozer-5.5.1.jar 

Это мне не понятно, почему вы настроили вещи таким образом. Ваш образец отлично работает для меня, если я удалю spring-devtools.properties. Возможно, образец не иллюстрирует проблему, которая заставила вас применить эту конфигурацию?

Если вам нужна эта конфигурация, и вы не хотите, чтобы проект панели был открыт в Eclipse, вам также нужно настроить панель, которая будет включена в перезагрузку, чтобы как она, так и Dozer, от которой она зависит, загружаются перезагрузка загрузчика классов:

restart.include.dozer=/dozer-5\.5\.1\.jar 
restart.include.bar=/bar-1\.0-SNAPSHOT\.jar 
+0

Thnaks! Как и почему spring-devool.properties, см. Https://github.com/spring-projects/spring-boot/issues/4636 – zhuguowei

+0

, и я был немного обеспокоен тем, что содержимое 'spring-devtools.properties' будет постоянно увеличение – zhuguowei

+0

см. мой пост выше, 'DozerBeanMapper' загружается дважды. Где он загружен? одно место в проекте bar: 'private final static DozerBeanMapper dozer = new DozerBeanMapper();', другой - '@Bean public Mapper fooDozerBeanMapper()' в FooApplication. Я прав? который является базовым calssloader? потому что я специально объяснил 'restart.include.dozer =/dozer-5 \ .5 \ .1 \ .jar', почему они не оба загружаются перезагрузкой classloader? – zhuguowei