【问题标题】:How to run hawt.io in spring boot application with embedded tomcat如何在带有嵌入式 tomcat 的 Spring Boot 应用程序中运行 hawt.io
【发布时间】:2015-07-31 07:29:28
【问题描述】:

我想将 hawt.io 作为嵌入式组件添加到具有嵌入式 tomcat 服务器的 spring boot 'fat jar' 应用程序中。

我该怎么做? 如何部署 hawt.io 战争文件?

更新: 我添加了依赖项:

  • hawtio-web
  • hawtio-core
  • hawtio-plugin-mbean
  • hawtio-springboot 到我的pom

当我现在启动应用程序并打开 url localhost:8080/hatio/index.html 时,我会看到登录页面。 由于我不知道用户名和密码,我添加了 hawtio.authenticationEnabled=false 到我的 application.properties

但是 - 现在我收到警告 ' WARN 3420 --- [nio-8080-exec-4] o.s.web.servlet.PageNotFound : 不支持请求方法 'POST' 后跟一个空指针异常。

参考:http://hawt.io/configuration/index.html

【问题讨论】:

    标签: spring-boot embedded-jetty hawtio


    【解决方案1】:

    我遇到了完全相同的问题 - 这是我解决问题的方法。

    我发现 spring-boot 不支持旧的 web.xml 配置,这是当 maven-war-plugin 在你自己的战争之上覆盖 hawtio-web 项目时得到的。 由此产生的战争既包含您的网络代码,也包含 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>
    

    添加一个配置类来配置 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

    希望这会有所帮助。

    祝你好运。

    【讨论】:

    • 对我来说很好,除了我评论了“/”的重定向,因为我的一些骆驼服务在通过 hawt.io 骆驼控制台导航后。
    • 我对此进行了改进并将其添加为 hawtio 本身的功能。 github.com/hawtio/hawtio/pull/1969我不确定它会在哪个版本中。
    • 更新了示例,现在它可以在刷新页面时工作,并且没有覆盖。添加了对我提交到 hawtio 的补丁的引用。
    • 对这个设置的身份验证有任何想法吗?我已经设法让事情正常进行,但无法通过登录屏幕。我尝试将hawtio.authenticationEnabled=false 添加到属性文件中。 Hawt.io docs 提及 TomCat 的设置,但这是嵌入的。不确定tomcat-users.xml 是否适用。
    • 使用java -Dhawtio.authenticationEnabled=false 运行确实允许我禁用登录屏幕,但仪表板左上角的图像链接损坏且导航无效。 Chrome 控制台显示大量 404。
    【解决方案2】:

    这是我从最新教程中得到的(我猜 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>
    

    下面是一个示例应用程序类,它设置了禁用身份验证的 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

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2014-12-24
      • 2021-01-30
      • 2018-05-29
      • 2018-06-13
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多