如何在 spring 中 运行 hawt.io 使用嵌入式 tomcat 引导应用程序
How to run hawt.io in spring boot application with embedded tomcat
我想将 hawt.io 作为嵌入式组件添加到我的 spring 引导 'fat jar' 应用程序中,该应用程序具有嵌入式 tomcat 服务器。
我该怎么做?
我如何部署 hawt.io war 文件?
更新:
我添加了依赖项:
- hawtio-web
- hawtio-core
- hawtio-plugin-mbean
- hawtio-springboot
到我的 pom
当我现在启动应用程序并打开 url localhost:8080/hatio/index.html 我得到了登录页面。
因为我不知道用户名和密码,所以我添加了
hawtio.authenticationEnabled=假
我的 application.properties
但是 - 现在我得到一个 warning
'警告 3420 --- [nio-8080-exec-4] o.s.web.servlet.PageNotFound:不支持请求方法 'POST''
后跟一个空指针异常。
我遇到了完全相同的问题 - 这是我解决问题的方法。
我发现 spring-boot 不支持遗留的 web.xml 配置,当 maven-war-plugin
将 hawtio-web 项目覆盖在拥有 war。
生成的 war 包含您的网络代码以及 hawtio-web 存档的内容。
见http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
所以我开始了在 spring 中配置 servlet 和过滤器的过程。
首先添加必要的依赖pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>${spring-boot-version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-springboot</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-core</artifactId>
<version>${hawtio.version}</version>
</dependency>
</dependencies>
我正在使用这些版本:
<hawtio.version>2.0.0</hawtio.version>
<spring-boot.version>1.2.3.RELEASE</spring-boot.version>
添加配置 class 以配置 servlet 和过滤器:
@Configuration
public class HawtioConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/hawtio/plugins/**").addResourceLocations("/app/", "classpath:/static/hawtio/app/");
registry.addResourceHandler("/hawtio/**").addResourceLocations("/", "/app/", "classpath:/static/hawtio/",
"classpath:/static/hawtio/app/");
}
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
registry.addViewController("/hawtio/plugin").setViewName("forward:/plugin");
registry.addViewController("/hawtio/").setViewName("redirect:/hawtio/index.html");
}
@Bean
public ServletRegistrationBean userServlet() {
return new ServletRegistrationBean(new UserServlet(), "/user/*", "/hawtio/user/*");
}
@Bean
public ServletRegistrationBean jolokiaproxy() {
return new ServletRegistrationBean(new ProxyServlet(), "/hawtio/proxy/*");
}
@Bean
public ServletRegistrationBean kubeservice() {
return new ServletRegistrationBean(new ServiceServlet(), "/hawtio/service/*");
}
@Bean
public ServletRegistrationBean kubepod() {
return new ServletRegistrationBean(new PodServlet(), "/hawtio/pod/*");
}
@Bean
public ServletRegistrationBean fileupload() {
return new ServletRegistrationBean(new UploadServlet(), "/hawtio/file-upload/*");
}
@Bean
public ServletRegistrationBean loginservlet() {
return new ServletRegistrationBean(new LoginServlet(), "/hawtio/auth/login/*");
}
@Bean
public ServletRegistrationBean logoutservlet() {
return new ServletRegistrationBean(new LogoutServlet(), "/hawtio/auth/logout/*");
}
@Bean
public ServletRegistrationBean keycloakservlet() {
return new ServletRegistrationBean(new KeycloakServlet(), "/hawtio/keycloak/*");
}
@Bean
public ServletRegistrationBean exportcontextservlet() {
return new ServletRegistrationBean(new ExportContextServlet(), "/hawtio/exportContext/*");
}
@Bean
public ServletRegistrationBean mavenSource() {
return new ServletRegistrationBean(new JavaDocServlet(), "/hawtio/javadoc/*");
}
@Bean
public ServletRegistrationBean contextFormatter() {
return new ServletRegistrationBean(new ContextFormatterServlet(), "/hawtio/contextFormatter/*");
}
@Bean
public ServletRegistrationBean gitServlet() {
return new ServletRegistrationBean(new GitServlet(), "/hawtio/git/*");
}
@Bean
public ServletListenerRegistrationBean hawtioContextListener() {
return new ServletListenerRegistrationBean<>(new HawtioContextListener());
}
@Bean
public ServletListenerRegistrationBean fileCleanerCleanup() {
return new ServletListenerRegistrationBean<>(new FileCleanerCleanup());
}
@Bean
public FilterRegistrationBean redirectFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new RedirectFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean sessionExpiryFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new SessionExpiryFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean cacheFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new CacheHeadersFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean CORSFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new CORSFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean XFrameOptionsFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new XFrameOptionsFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean AuthenticationFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new AuthenticationFilter());
filter.setUrlPatterns(Arrays.asList("/hawtio/auth/*", "/jolokia/*", "/hawtio/upload/*", "/hawtio/javadoc/*"));
return filter;
}
}
我已经用 jetty 和 tomcat 测试了这个 - 它适用于两者。
我还提交了这个作为 hawtio 的补丁,但它还没有发布。您可以自己编译 hawtio 并导入 HawtioConfiguration:
https://github.com/hawtio/hawtio/blob/master/hawtio-springboot/src/main/java/io/hawt/springboot/HawtioConfiguration.java
我还更新了 hawtio-sample 以使用 HawtioConfiguration:
https://github.com/hawtio/hawtio/tree/master/hawtio-sample-springboot
现在我可以访问 http://localhost:8080/hawtio/index.html
访问 hawtio
希望这对您有所帮助。
祝你好运。
这是我从最新的教程中得到的(我猜 Hawtio 对此进行了改进,因为最初提出并回答了这个问题):使用 spring-boot-starter-parent 1.3.5.RELEASE, Hawtio 1.4.64版本,包括以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-springboot</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-core</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
</dependencies>
这是一个示例应用程序 class,它设置了禁用身份验证的 Hawtio:
@SpringBootApplication
@EnableHawtio
public class SampleApplication {
@Autowired
private ServletContext servletContext;
public static void main(String[] args) {
System.setProperty(AuthenticationFilter.HAWTIO_AUTHENTICATION_ENABLED, "false");
SpringApplication.run(SampleApplication.class, args);
}
@PostConstruct
public void init() {
final ConfigManager configManager = new ConfigManager();
configManager.init();
servletContext.setAttribute("ConfigManager", configManager);
}
/**
* Set things up to be in offline mode
* @return
* @throws Exception
*/
@Bean
public ConfigFacade configFacade() throws Exception {
ConfigFacade config = new ConfigFacade() {
public boolean isOffline() {
return true;
}
};
config.init();
return config;
}
}
您可以在包含 Apache Camel 的示例应用程序中找到完整代码:https://github.com/bowdoincollege/spring-boot-camel-sample
我想将 hawt.io 作为嵌入式组件添加到我的 spring 引导 'fat jar' 应用程序中,该应用程序具有嵌入式 tomcat 服务器。
我该怎么做? 我如何部署 hawt.io war 文件?
更新: 我添加了依赖项:
- hawtio-web
- hawtio-core
- hawtio-plugin-mbean
- hawtio-springboot 到我的 pom
当我现在启动应用程序并打开 url localhost:8080/hatio/index.html 我得到了登录页面。 因为我不知道用户名和密码,所以我添加了 hawtio.authenticationEnabled=假 我的 application.properties
但是 - 现在我得到一个 warning '警告 3420 --- [nio-8080-exec-4] o.s.web.servlet.PageNotFound:不支持请求方法 'POST'' 后跟一个空指针异常。
我遇到了完全相同的问题 - 这是我解决问题的方法。
我发现 spring-boot 不支持遗留的 web.xml 配置,当 maven-war-plugin
将 hawtio-web 项目覆盖在拥有 war。
生成的 war 包含您的网络代码以及 hawtio-web 存档的内容。
见http://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
所以我开始了在 spring 中配置 servlet 和过滤器的过程。
首先添加必要的依赖pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>${spring-boot-version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-springboot</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-core</artifactId>
<version>${hawtio.version}</version>
</dependency>
</dependencies>
我正在使用这些版本:
<hawtio.version>2.0.0</hawtio.version>
<spring-boot.version>1.2.3.RELEASE</spring-boot.version>
添加配置 class 以配置 servlet 和过滤器:
@Configuration
public class HawtioConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/hawtio/plugins/**").addResourceLocations("/app/", "classpath:/static/hawtio/app/");
registry.addResourceHandler("/hawtio/**").addResourceLocations("/", "/app/", "classpath:/static/hawtio/",
"classpath:/static/hawtio/app/");
}
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
registry.addViewController("/hawtio/plugin").setViewName("forward:/plugin");
registry.addViewController("/hawtio/").setViewName("redirect:/hawtio/index.html");
}
@Bean
public ServletRegistrationBean userServlet() {
return new ServletRegistrationBean(new UserServlet(), "/user/*", "/hawtio/user/*");
}
@Bean
public ServletRegistrationBean jolokiaproxy() {
return new ServletRegistrationBean(new ProxyServlet(), "/hawtio/proxy/*");
}
@Bean
public ServletRegistrationBean kubeservice() {
return new ServletRegistrationBean(new ServiceServlet(), "/hawtio/service/*");
}
@Bean
public ServletRegistrationBean kubepod() {
return new ServletRegistrationBean(new PodServlet(), "/hawtio/pod/*");
}
@Bean
public ServletRegistrationBean fileupload() {
return new ServletRegistrationBean(new UploadServlet(), "/hawtio/file-upload/*");
}
@Bean
public ServletRegistrationBean loginservlet() {
return new ServletRegistrationBean(new LoginServlet(), "/hawtio/auth/login/*");
}
@Bean
public ServletRegistrationBean logoutservlet() {
return new ServletRegistrationBean(new LogoutServlet(), "/hawtio/auth/logout/*");
}
@Bean
public ServletRegistrationBean keycloakservlet() {
return new ServletRegistrationBean(new KeycloakServlet(), "/hawtio/keycloak/*");
}
@Bean
public ServletRegistrationBean exportcontextservlet() {
return new ServletRegistrationBean(new ExportContextServlet(), "/hawtio/exportContext/*");
}
@Bean
public ServletRegistrationBean mavenSource() {
return new ServletRegistrationBean(new JavaDocServlet(), "/hawtio/javadoc/*");
}
@Bean
public ServletRegistrationBean contextFormatter() {
return new ServletRegistrationBean(new ContextFormatterServlet(), "/hawtio/contextFormatter/*");
}
@Bean
public ServletRegistrationBean gitServlet() {
return new ServletRegistrationBean(new GitServlet(), "/hawtio/git/*");
}
@Bean
public ServletListenerRegistrationBean hawtioContextListener() {
return new ServletListenerRegistrationBean<>(new HawtioContextListener());
}
@Bean
public ServletListenerRegistrationBean fileCleanerCleanup() {
return new ServletListenerRegistrationBean<>(new FileCleanerCleanup());
}
@Bean
public FilterRegistrationBean redirectFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new RedirectFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean sessionExpiryFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new SessionExpiryFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean cacheFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new CacheHeadersFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean CORSFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new CORSFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean XFrameOptionsFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new XFrameOptionsFilter());
filter.setUrlPatterns(Collections.singletonList("/hawtio/*"));
return filter;
}
@Bean
public FilterRegistrationBean AuthenticationFilter() {
final FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new AuthenticationFilter());
filter.setUrlPatterns(Arrays.asList("/hawtio/auth/*", "/jolokia/*", "/hawtio/upload/*", "/hawtio/javadoc/*"));
return filter;
}
}
我已经用 jetty 和 tomcat 测试了这个 - 它适用于两者。 我还提交了这个作为 hawtio 的补丁,但它还没有发布。您可以自己编译 hawtio 并导入 HawtioConfiguration: https://github.com/hawtio/hawtio/blob/master/hawtio-springboot/src/main/java/io/hawt/springboot/HawtioConfiguration.java
我还更新了 hawtio-sample 以使用 HawtioConfiguration: https://github.com/hawtio/hawtio/tree/master/hawtio-sample-springboot
现在我可以访问 http://localhost:8080/hawtio/index.html
访问 hawtio希望这对您有所帮助。
祝你好运。
这是我从最新的教程中得到的(我猜 Hawtio 对此进行了改进,因为最初提出并回答了这个问题):使用 spring-boot-starter-parent 1.3.5.RELEASE, Hawtio 1.4.64版本,包括以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-springboot</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>io.hawt</groupId>
<artifactId>hawtio-core</artifactId>
<version>${hawtio.version}</version>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
</dependencies>
这是一个示例应用程序 class,它设置了禁用身份验证的 Hawtio:
@SpringBootApplication
@EnableHawtio
public class SampleApplication {
@Autowired
private ServletContext servletContext;
public static void main(String[] args) {
System.setProperty(AuthenticationFilter.HAWTIO_AUTHENTICATION_ENABLED, "false");
SpringApplication.run(SampleApplication.class, args);
}
@PostConstruct
public void init() {
final ConfigManager configManager = new ConfigManager();
configManager.init();
servletContext.setAttribute("ConfigManager", configManager);
}
/**
* Set things up to be in offline mode
* @return
* @throws Exception
*/
@Bean
public ConfigFacade configFacade() throws Exception {
ConfigFacade config = new ConfigFacade() {
public boolean isOffline() {
return true;
}
};
config.init();
return config;
}
}
您可以在包含 Apache Camel 的示例应用程序中找到完整代码:https://github.com/bowdoincollege/spring-boot-camel-sample