2

I'm using Spring Boot 2.0.0.M2 and Vaadin 8.1.0.rc1 in my project. Since I need to use custom widgets, I've added vaadin-client-compiler dependency to my project. The first weird thing that happened was that embedded Tomcat become replaced by embedded Jetty automatically. The second problem was that I've started to get warnings like this one during application initialization:

2017-08-01 11:07:27.822  WARN 1012 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar] from classloader hierarchy

java.io.FileNotFoundException: /Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_101]
    at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:43) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:327) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:277) ~[tomcat-embed-core-8.5.5.jar:8.5.5]
    at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [apache-jsp-8.5.9.1.jar:2.3]
    at org.springframework.boot.web.embedded.jetty.JasperInitializer.doStart(JasperInitializer.java:91) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:844) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:344) [jetty-servlet-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1501) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1463) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:785) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:261) [jetty-servlet-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) [jetty-webapp-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.Server.start(Server.java:452) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.server.Server.doStart(Server.java:419) [jetty-server-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.4.6.v20170531.jar:9.4.6.v20170531]
    at org.springframework.boot.web.embedded.jetty.JettyWebServer.initialize(JettyWebServer.java:103) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyWebServer.<init>(JettyWebServer.java:81) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getJettyWebServer(JettyServletWebServerFactory.java:537) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getWebServer(JettyServletWebServerFactory.java:175) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:161) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:134) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536) [spring-context-5.0.0.RC2.jar:5.0.0.RC2]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:122) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245) [spring-boot-2.0.0.M2.jar:2.0.0.M2]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233) [spring-boot-2.0.0.M2.jar:2.0.0.M2]

Still application worked properly: I just wanted to get rid of these warnings. So I've decided to set back Tomcat instead of Jetty and excluded Jetty like this:

<dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>vaadin-client-compiler</artifactId>
    <version>${vaadin.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
        </exclusion>
    </exclusions>
</dependency>

After it was done, warnings haven't disappeared, but have changed a bit:

java.io.FileNotFoundException: /Users/mac/.m2/repository/com/vaadin/vaadin-sass-compiler/0.9.13/sac-1.3.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:219) ~[na:1.8.0_101]
    at java.util.zip.ZipFile.<init>(ZipFile.java:149) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_101]
    at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_101]
    at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:60) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:338) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:288) ~[tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [apache-jsp-8.5.9.1.jar:2.3]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.15.jar:8.5.15]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]

I've found a thread on Vaadin forum suggesting to use 8.0.32 version of Tomcat to fix it. When I switched to it, application stopped working at all:

Caused by: java.lang.ClassNotFoundException: org.apache.juli.WebappProperties
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 29 more

Then I've found some other thread suggesting to use Tomcat 8.5.5 as it has some fix (can't remember the URL of a thread). I've tried 8.5.5: warnings came back. Then I've also tried 8.5.19 and even 9.0.0.M25 with the same result.

So where is the problem: Spring, Tomcat, Vaadin or Maven dependencies versioning? And how do I solve it? These warnings don't fail the application, but I don't want them to appear in my startup log.

UPDATE

Here is my POM, Application-class and full mvn spring-boot:run output: https://gist.github.com/dtitov/ce9c098c8aa64073b3a22d2178f9aac7

Dmytro Titov
  • 2,802
  • 6
  • 38
  • 60

2 Answers2

3

Disclaimer: Probably this would be better suited as a comment but it does not fit the space.


1) You can use the stable Vaadin 8.1.0 and vaadin-spring-boot-starter 2.0.1. The Vaadin module versions are managed by the vaadin-bom (${vaadin.version} is a property in my pom and has a value of 8.1.0):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-bom</artifactId>
            <version>${vaadin.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

After this, you won't need to change their versions each time you change your Vaadin version (unless you really need to use a specific version):

<dependency>
     <groupId>com.vaadin</groupId>
     <artifactId>vaadin-spring-boot-starter</artifactId>
 </dependency>

2) You should use the same vaadin-maven-plugin as your Vaadin version to avoid widgetset version mismatches/issues. You're using Vaadin 8.1.0 but the plugin version is 8.0.6. You can use <version>${vaadin.version}</version> to sync them.


3) As per the docs, vaadin-client-compiler is used only at compile time and should not be deployed with your application:

vaadin-client-compiler-8.x.x.jar
The Vaadin Client Compiler is a Java-to-JavaScript compiler that allows building client-side modules, such as the Client-Side Engine (widget set) required for server-side applications. The compiler is needed, for example, for compiling add-on components to the application widget set, as described in "Using Vaadin Add-ons".

For detailed information regarding the compiler, see "Compiling a Client-Side Module". Note that you should not deploy this library with a web application.

You can add <scope>provided</scope> to the dependency and that should probably fix your tomcat issue.

Important edit: I've checked the logs and it looks like you don't even need it in your classpath for your widgetset. The vaadin-maven-plugin uses it to compile your widgetset behind the curtain:

[INFO] --- vaadin-maven-plugin:8.1.0:compile (default) @ test ---
[INFO] Using com.vaadin:vaadin-client-compiler version 8.1.0
[INFO] Compiling module MyCustomWidgetSet
[INFO]    Computing all possible rebind results for 'com.vaadin.client.metadata.ConnectorBundleLoader'
...

After removing it, everything went as expected. Not entirely sure, but it's possible that it's required only for certain add-ons or the vaadin-maven-plugin. I didn't need to write any so far, so perhaps someone that has actually required it could provide more insight.


4) You can also remove vaadin-client-compiled as per the same docs suggestion.

ollitietavainen
  • 3,900
  • 13
  • 30
Morfic
  • 15,178
  • 3
  • 51
  • 61
  • OK, long comment for long answer :) 1) Thanks for pointing to 8.1.0 (and I already use `vaadin-spring-boot-starter` 2.0.1), but it didn't help. 2) I've tried to set `provided` and even `compile`, but it also didn't help: I still see these warnings when executing `spring-boot:run`. 3) Mentioning `spring-boot-starter-tomcat` dependency in POM apparently doesn't enable Tomcat, so Jetty is still loaded and I have to explicitly exclude it. – Dmytro Titov Aug 01 '17 at 12:36
  • @DmytroTitov No problem. I have a setup similar to yours and it works just fine, most likely we're not using the exact same add-ons and the dependencies are defined in a different order. Nonetheless, if after a `mvn clean boot:run` you're still having issues there's probably something off in the POM. Would you be able to share a [sscce](http://sscce.org) that reproduces your issue (pom, boot launcher class and basic UI)? – Morfic Aug 01 '17 at 12:43
  • @DmytroTitov thanks. Your pom is missing a `<` in `test/artifactId>` but otherwise I was able to reproduce the issue. I've updated my answer, please go through 2, 3 & 4, as 1 is unchanged. In short, you can remove `vaadin-client-compiler` from your dependency list and it should be fine. Also make sure your `vaadin-maven-pluing` is the same version as the framework. – Morfic Aug 01 '17 at 14:43
  • Thanks a lot! That helped :) – Dmytro Titov Aug 01 '17 at 15:15
0

Generally, for other libraries, it can help to disable the scan of manifest in the jar(s) referencing weired Class-Path. Refers to Disable scanManifest of Jar Scan in tomcat embed in spring boot for details (use precise enough filters).

Florian H.
  • 143
  • 9