Uploaded image for project: 'camunda BPM'
  1. camunda BPM
  2. CAM-10738

Spring Boot Starter: Cockpit not accessible

    Details

    • Type: Bug Report
    • Status: Ready
    • Priority: L3 - Default
    • Resolution: Unresolved
    • Affects Version/s: spring-boot 3.3.3
    • Fix Version/s: None
    • Component/s: spring-boot
    • Labels:
      None
    • Environment:
      * Spring Boot 2.1.7.RELEASE
      * Camunda BPM 7.11.0
      * Camunda BPM Spring Boot Starter 3.3.3
      * Gradle 5.5.1

      Description

      The Issue

      Summary

      • Expectation: I want to embed Camunda into my Spring Boot application and access Camunda Cockpit with my browser.
      • Reality: My browser requests /api/cockpit/plugin/cockpitPlugins/static/app/plugin.css and api/cockpit/plugin/cockpitPlugins/static/app/plugin.js?bust=7.11.0, but does receive HTTP 404 response and the Spring Boot application shows the following Exceptions.

      I discussed this issue in the forum (https://forum.camunda.org/t/404-error-after-cockpit-upgrade-to-7-9/12437/2?u=gregor). However, after three days of debugging I think I know why it doesn't work, but not yet how to fix it. Right now I assume there is some bug based on my investigations, hence this bug report. Note that in the forum thread I had Spring Security enabled. As you can see below in the build.gradle I have removed it to make sure it is not connected to some Spring Security interaction.

      *Please* let me know if I can provide additional information.

      Exception:

      2019-08-13 11:58:09.103  WARN 24360 --- [nio-8090-exec-6] ExceptionHandler                         : org.camunda.bpm.engine.rest.exception.RestException: It was not able to load the following file 'app/plugin.css'.
      	at org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource.getAsset(AbstractAppPluginRootResource.java:146)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
      	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
      	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
      	at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
      	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
      	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
      	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
      	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
      	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
      	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
      	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.engine.ProcessEnginesFilter.applyFilter(ProcessEnginesFilter.java:130)
      	at org.camunda.bpm.webapp.impl.filter.AbstractTemplateFilter.doFilter(AbstractTemplateFilter.java:58)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.LazyDelegateFilter.doFilter(LazyDelegateFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.filter.headersec.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:83)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.SpringBootCsrfPreventionFilter.doFilter(SpringBootCsrfPreventionFilter.java:129)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilterSecure(SecurityFilter.java:71)
      	at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilter(SecurityFilter.java:55)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.LazyDelegateFilter.doFilter(LazyDelegateFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.execute(AuthenticationFilter.java:62)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.execute(AuthenticationFilter.java:60)
      	at org.camunda.bpm.webapp.impl.security.SecurityActions.runWithAuthentications(SecurityActions.java:44)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.AbstractRequestLoggingFilter.doFilterInternal(AbstractRequestLoggingFilter.java:262)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
      	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
      	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
      	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
      	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
      	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
      	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
      	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
      	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
      	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
      	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
      	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
      	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      	at java.base/java.lang.Thread.run(Thread.java:835)
      
      2019-08-13 11:58:09.103  WARN 24360 --- [nio-8090-exec-8] ExceptionHandler                         : org.camunda.bpm.engine.rest.exception.RestException: It was not able to load the following file 'app/plugin.js'.
      	at org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource.getAsset(AbstractAppPluginRootResource.java:146)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
      	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
      	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200)
      	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
      	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
      	at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
      	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
      	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
      	at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
      	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
      	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
      	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
      	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
      	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
      	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.engine.ProcessEnginesFilter.applyFilter(ProcessEnginesFilter.java:130)
      	at org.camunda.bpm.webapp.impl.filter.AbstractTemplateFilter.doFilter(AbstractTemplateFilter.java:58)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.LazyDelegateFilter.doFilter(LazyDelegateFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.filter.headersec.HttpHeaderSecurityFilter.doFilter(HttpHeaderSecurityFilter.java:83)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.SpringBootCsrfPreventionFilter.doFilter(SpringBootCsrfPreventionFilter.java:129)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilterSecure(SecurityFilter.java:71)
      	at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilter(SecurityFilter.java:55)
      	at org.camunda.bpm.spring.boot.starter.webapp.filter.LazyDelegateFilter.doFilter(LazyDelegateFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.execute(AuthenticationFilter.java:62)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.execute(AuthenticationFilter.java:60)
      	at org.camunda.bpm.webapp.impl.security.SecurityActions.runWithAuthentications(SecurityActions.java:44)
      	at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:60)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.springframework.web.filter.AbstractRequestLoggingFilter.doFilterInternal(AbstractRequestLoggingFilter.java:262)
      	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)
      	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
      	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
      	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
      	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
      	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
      	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
      	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
      	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
      	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
      	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
      	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
      	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
      	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      	at java.base/java.lang.Thread.run(Thread.java:835)
      

      Environment

      • Spring Boot 2.1.7.RELEASE
      • Camunda BPM 7.11.0
      • Camunda BPM Spring Boot Starter 3.3.3
      • Gradle 5.5.1

      Gradle Configuration

      The following Gradle configuration is a subproject and the versions of each package are configured in the root build.gradle.

      apply plugin: 'org.springframework.boot'
      apply plugin: 'io.freefair.lombok'
      apply plugin: 'net.ltgt.apt'
      apply plugin: 'net.ltgt.apt-idea'
      
      dependencies {
      
          implementation group: 'org.springframework.cloud', name:'spring-cloud-starter-openfeign'
      
          implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'
          implementation group: 'org.springframework.boot', name: 'spring-boot-starter-amqp'
          implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb'
          implementation group: 'org.springframework.boot', name: 'spring-boot-starter-mail'
      
          implementation group: 'org.springframework', name: 'spring-context-support'
      
          implementation group: 'io.springfox', name: 'springfox-swagger2'
          implementation group: 'io.springfox', name: 'springfox-swagger-ui'
      
          implementation group: 'org.modelmapper', name: 'modelmapper'
          implementation group: 'org.springframework.boot', name: 'spring-boot-starter-json'
      
          implementation group: 'org.quartz-scheduler', name: 'quartz'
          implementation group: 'org.quartz-scheduler', name: 'quartz-jobs'
      
          implementation group: 'org.camunda.bpm.springboot', name: 'camunda-bpm-spring-boot-starter'
          implementation group: 'org.camunda.bpm.springboot', name: 'camunda-bpm-spring-boot-starter-webapp'
          implementation group: 'org.camunda.bpm.springboot', name: 'camunda-bpm-spring-boot-starter-rest'
          implementation group: 'org.camunda.bpm.webapp', name: 'camunda-webapp-webjar'
      
          implementation group: 'com.sun.xml.bind', name: 'jaxb-impl'
          implementation group: 'com.h2database', name: 'h2'
      
          implementation group: 'org.mapstruct', name: 'mapstruct'
          annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor'
      
          testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test'
          testImplementation group: 'org.springframework.amqp', name: 'spring-rabbit-junit'
          testImplementation group: 'org.springframework.amqp', name: 'spring-rabbit-test'
      
          testImplementation group: 'org.apache.httpcomponents', name: 'httpclient'
      
          testImplementation group: 'org.camunda.bpm.springboot', name: 'camunda-bpm-spring-boot-starter-test'
      
          testRuntimeOnly group: 'de.flapdoodle.embed', name: 'de.flapdoodle.embed.mongo'
      }
      

      Identified Reason

      The issue manifests if we start the Spring Boot application with the bootRun Gradle task (introduced by Gradle Plugin org.springframework.boot) or run it with IntelliJ's "Services" tab where we can start the Spring Boot application, too. Note that IntelliJ is configured to use Gradle to start (File | Settings | Build, Execution, Deployment | Build Tools | Gradle):

      • "Build and run using" is set to "Gradle"
      • "Run tests using" is set to "Gradle"
      • "Use Gradle from" is set to "gradle-wrapper.properties"

      However, if we create a Fat Jar with bootJar Gradle Task (also introduced by Gradle Plugin org.springframework.boot) and start that, the above issue does not manifest itself and I can access Camunda Cockpit.

      The key difference we could identify is in org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource#getPluginAssetAsStream as described in the following chapters.

      Running as a Fat Jar

      The following observations are based on running our Spring Boot application with Gradle or from within IntelliJ.

      Let's only look at the browser's request for api/cockpit/plugin/cockpitPlugins/static/app/plugin.js?bust=7.11.0: This leads to the execution of org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource#getPluginAssetAsStream where fileName is app/plugin.js. This leads to a call of getWebResourceAsStream(assetDirectory, fileName) which succeeds, i.e. returns an InputStream with the content of the requested file.

      Running with Gradle/IntelliJ

      The following observations are based on running our Spring Boot application as a Fat Jar, but still with an attached Debugger: Ran the JAR with IntelliJ with an attached debugger.

      Again, let's only look at the browser's request for api/cockpit/plugin/cockpitPlugins/static/app/plugin.js?bust=7.11.0: This leads to the execution of org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource#getPluginAssetAsStream where fileName is app/plugin.js. This time the call of getWebResourceAsStream(assetDirectory, fileName) fails, i.e. it returns null. This leads to calling org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource#getClasspathResourceAsStream, however this fails too by returning null.

      Now to the interesting part: The call to org.camunda.bpm.webapp.plugin.resource.AbstractAppPluginRootResource#getClasspathResourceAsStream results in calling java.lang.ClassLoader#getResourceAsStream(resourceName) with resourceName having the value plugin/cockpit/app/plugin.js. This fails as already mentioned. But if we change plugin.getClass().getClassLoader().getResourceAsStream(resourceName) to plugin.getClass().getClassLoader().getResourceAsStream("META-INF/resources/" + resourceName) it works and returns an input stream.

      Note that plugin.getClass().getClassLoader() is a ClassLoaders$AppClassLoader, if this helps.

      Assumed issue

      Right now I assume that "META-INF/resources" is missing and should have been added somewhere.
      Edit: I am still debugging and now I'm not sure if "META-INF/resources" is missing or if getWebResourceAsStream(assetDirectory, fileName) should find the resource in case the application is started with Gradle/IntelliJ, but doesn't.

        Activity

        Hide
        tassilo.weidner Tassilo Weidner added a comment -

        Hi Gregor,

        thanks for reaching out to us with this Bug Report.

        I will have a look and come back to you as soon as I have more insights.

        Stay tuned!

        Cheers,
        Tassilo

        Show
        tassilo.weidner Tassilo Weidner added a comment - Hi Gregor, thanks for reaching out to us with this Bug Report. I will have a look and come back to you as soon as I have more insights. Stay tuned! Cheers, Tassilo
        Hide
        tassilo.weidner Tassilo Weidner added a comment -

        Hi Gregor,

        I'm not able to reproduce your problem.

        Could you please provide all the steps to reproduce the problem?

        Cheers,
        Tassilo

        Show
        tassilo.weidner Tassilo Weidner added a comment - Hi Gregor, I'm not able to reproduce your problem. Could you please provide all the steps to reproduce the problem? Cheers, Tassilo
        Hide
        groggi Gregor Wegberg added a comment - - edited

        Hey Tassilo,

        Thank you for looking into the matter! I am on the road right now, but one of my peers took some time and looked into the matter based on the above bug report. It looks like he could resolve the issue for IntelliJ.

        Our project has the issue that due to a very long classpath it hits Window's command length limit. In this case our IntelliJ is configured to resolve it by creating a JAR with the long classpath in its manifest:

        If we change it to "@argFiles", the issue is resolved and he could access Camunda's Cockpit. I just tested it myself and yes, it works. So much time spent debugging and it is just such a small settings change to get it working. I love software development

        There are other projects with a similar issue:

        For now the issue is resolved for us as we can configure IntelliJ to get it working during development and we use Fat JARs anyway for running the application in production. Maybe we will spend some time and try to find a way to extend bootRun to use "@argFiles", too. There is also discussion going on to built in support for this case into Gradle itself (see https://github.com/gradle/gradle/issues/1989). Of course, it would be interesting to see if there is a way to resolve this issue in Camunda. But I have the feeling that this is a corner case that is not worth the time to be taken care of separately.

        Show
        groggi Gregor Wegberg added a comment - - edited Hey Tassilo, Thank you for looking into the matter! I am on the road right now, but one of my peers took some time and looked into the matter based on the above bug report. It looks like he could resolve the issue for IntelliJ. Our project has the issue that due to a very long classpath it hits Window's command length limit . In this case our IntelliJ is configured to resolve it by creating a JAR with the long classpath in its manifest: If we change it to "@argFiles", the issue is resolved and he could access Camunda's Cockpit. I just tested it myself and yes, it works. So much time spent debugging and it is just such a small settings change to get it working. I love software development There are other projects with a similar issue: https://github.com/gradle/gradle/issues/1989#issuecomment-360205567 https://bz.apache.org/bugzilla/show_bug.cgi?id=59226 For now the issue is resolved for us as we can configure IntelliJ to get it working during development and we use Fat JARs anyway for running the application in production. Maybe we will spend some time and try to find a way to extend bootRun to use "@argFiles", too. There is also discussion going on to built in support for this case into Gradle itself (see https://github.com/gradle/gradle/issues/1989 ). Of course, it would be interesting to see if there is a way to resolve this issue in Camunda. But I have the feeling that this is a corner case that is not worth the time to be taken care of separately.
        Hide
        tassilo.weidner Tassilo Weidner added a comment - - edited

        Hi Gregor,

        I'm happy that you were able to resolve your problem.

        Thank you very much for providing so many additional insights. I will leave this ticket open to keep track of this issue.

        Cheers,
        Tassilo

        Show
        tassilo.weidner Tassilo Weidner added a comment - - edited Hi Gregor, I'm happy that you were able to resolve your problem. Thank you very much for providing so many additional insights. I will leave this ticket open to keep track of this issue. Cheers, Tassilo

          People

          • Assignee:
            Unassigned
            Reporter:
            groggi Gregor Wegberg
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:

              Development