Spring Boot, Spring Loaded, Eclipse, Maven базовый пример
Я считаю, что базовый пример установки Spring Boot с Spring Loaded не работает в соответствии с документацией. Я следовал инструкциям на http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/, единственное отличие состоит в том, что я поставил мой класс в пакет и использовал выпускную версию родительского pom. Приложение работает отлично. Затем я добавил пружину, загруженную в файл POM, как описано в документе.
Я запускаю приложение с помощью mvn spring-boot:run.
Изменение выходного сигнала моего контроллера, например "Hello World" на "Hello me", не приводит к перезагрузке.
Я попытался запустить приложение Java с параметром командной строки javaagent, описанным в других местах, но это тоже не работает.
Пом выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.0.RELEASE</version>
</parent>
<!-- Additional lines to be added here... -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Скомпилированные классы находятся здесь: project_dir \ target \ classes (я использую Eclipse и плагин m2e).
Журнал запуска:
[INFO] Scanning for projects...
[INFO]
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:1.2.0.RELEASE:run (default-cli) @ myproject >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myproject ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myproject ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\dev\src\scrapi\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myproject ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\dev\src\scrapi\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myproject ---
[INFO] No sources to compile
[INFO]
[INFO] <<< spring-boot-maven-plugin:1.2.0.RELEASE:run (default-cli) @ myproject <<<
[INFO]
[INFO] --- spring-boot-maven-plugin:1.2.0.RELEASE:run (default-cli) @ myproject ---
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.2.0.RELEASE)
2015-01-02 13:23:25.311 INFO 2180 --- [.Example.main()] first.Example : Starting Example on DEFRAVD804016 with PID 2180 (C:\dev\src\scrapi\target\classes started by john in C:\dev\src\scrapi)
2015-01-02 13:23:25.359 INFO 2180 --- [.Example.main()] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@44354005: startup date [Fri Jan 02 13:23:25 CET 2015]; root of context hierarchy
2015-01-02 13:23:26.193 INFO 2180 --- [.Example.main()] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-01-02 13:23:27.121 INFO 2180 --- [.Example.main()] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8182/http
2015-01-02 13:23:27.689 INFO 2180 --- [.Example.main()] o.apache.catalina.core.StandardService : Starting service Tomcat
2015-01-02 13:23:27.691 INFO 2180 --- [.Example.main()] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.15
2015-01-02 13:23:27.814 INFO 2180 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2015-01-02 13:23:27.814 INFO 2180 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2457 ms
2015-01-02 13:23:28.653 INFO 2180 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2015-01-02 13:23:28.657 INFO 2180 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-01-02 13:23:28.657 INFO 2180 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-01-02 13:23:28.883 INFO 2180 --- [.Example.main()] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@44354005: startup date [Fri Jan 02 13:23:25 CET 2015]; root of context hierarchy
2015-01-02 13:23:28.995 INFO 2180 --- [.Example.main()] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto java.lang.String first.Example.home()
2015-01-02 13:23:28.997 INFO 2180 --- [.Example.main()] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-01-02 13:23:28.998 INFO 2180 --- [.Example.main()] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2015-01-02 13:23:29.112 INFO 2180 --- [.Example.main()] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-01-02 13:23:29.112 INFO 2180 --- [.Example.main()] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-01-02 13:23:29.160 INFO 2180 --- [.Example.main()] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-01-02 13:23:29.268 INFO 2180 --- [.Example.main()] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2015-01-02 13:23:29.394 INFO 2180 --- [.Example.main()] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8182/http
2015-01-02 13:23:29.399 INFO 2180 --- [.Example.main()] first.Example : Started Example in 4.417 seconds (JVM running for 11.803)
Что мне нужно сделать, чтобы Spring Loaded работал в этом случае?
3 ответа
Я никогда не получал весну, работающую таким образом. Лично я использую "старый способ", который работал каждый раз для меня. Пожалуйста, попробуйте следовать этому:
Откройте конфигурацию запуска / отладки в Eclipse.
В левой части разверните опцию Java Application и выберите свою конфигурацию запуска. App
в моем случае. Это распространенная ошибка при неправильной настройке, поэтому убедитесь, что project
а также main class
верно.
редактировать VM arguments
и установите его -javaagent:<spring_loaded_jar_file_path> -noverify
, Если у вас нет подпружиненных мест, самый простой способ получить это - проверить их официальное репо и запустить ./gradlew
,
Включен скрипт сборки gradle, запустите "./gradlew build", чтобы перестроить агент - он будет создан примерно так: springloaded/build/libs/springloaded-1.1.5.BUILD-SNAPSHOT.jar
Теперь вы можете просто запустить свой новый конфиг. Прежде чем проверять вещи в браузере, пожалуйста, проверьте свою конфигурацию в Eclipse. Щелкните правой кнопкой мыши ваше приложение Java и выберите свойства.
Тогда вы должны увидеть, что ваше приложение работает с javaagent.
Пожалуйста, дайте нам знать, если это работает для вас.
Хорошо, у меня есть хотя бы обходной путь, на который я наткнулся случайно. Надеюсь, это поможет кому-то понять, что именно происходит. Резюме: это работает, когда отладчик настроен в pom.
Я хотел включить отладку, поэтому я добавил в pom следующее, как описано в плагине doco:
<configuration>
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
</configuration>
Затем я перезапустил приложение, и вот, я получаю это в логах до весеннего логотипа:
[INFO] Attaching agents: [C:\dev\maven_local\org\springframework\springloade
d\1.2.1.RELEASE\springloaded-1.2.1.RELEASE.jar]
Listening for transport dt_socket at address: 5005
Запуск тогда прекращается, приложение не начнет обслуживать запросы, пока не будет присоединен отладчик (это нормально? РЕДАКТИРОВАТЬ: перечитывая страницу, на которую я ссылался, я вижу, что это ожидаемо. Было бы замечательно, если бы был способ для запуска продолжайте без необходимости подключать отладчик, но оставляя порт отладки открытым). Как только отладчик подключен, появляется логотип Spring и остальные журналы запуска. Затем я отсоединяю отладчик (просто чтобы доказать, что перезагрузка происходит не через отладчик), приложение продолжает обслуживать запросы, и, конечно же, горячая перезагрузка работает!
Большое спасибо @DaveSyer за помощь в отбрасывании других возможностей. Это будет делать пока, хотя, поскольку это не задокументировано, я предполагаю, что это требование не является преднамеренным, и было бы замечательно, если бы оно работало во всех случаях.
Попробуйте добавить Spring Loaded
как зависимость от Spring Boot Maven
плагин:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>${spring-loaded.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Я Spring Loaded
работает с простым Spring Cloud
приложение.