run a jar file

Hi,
I want to run a fat JAR file provided by a Vaadin-Spring-Boot project, but I get the following:

2020-01-22 15:14:10.598  INFO 11465 --- [           main]
 dev-updater                              : Running `npm install` ...
2020-01-22 15:14:10.765 ERROR 11465 --- [           main]
 o.a.c.c.C.[Tomcat]
.[localhost]
.
[/]       : Exception sending context initialized event to listener instance of class [com.vaadin.flow.spring.VaadinServletContextInitializer$DevModeServletContextListener]


java.lang.RuntimeException: Unable to initialize Vaadin DevModeHandler
        at com.vaadin.flow.spring.VaadinServletContextInitializer$DevModeServletContextListener.contextInitialized(VaadinServletContextInitializer.java:347) ~[vaadin-spring-12.1.2.jar!/:na]

        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4680) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_232]

        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_232]

        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_232]

        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_232]

        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.apache.catalina.startup.Tomcat.start(Tomcat.java:456) [tomcat-embed-core-9.0.22.jar!/:9.0.22]

        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:105) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:416) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:180) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) [spring-context-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at com.rubean.phonepos.ui.PersoServerApplication.main(PersoServerApplication.java:16) [classes!/:1.0-SNAPSHOT]

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_232]

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_232]

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_232]

        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_232]

        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) [user-interface.jar:1.0-SNAPSHOT]

Caused by: javax.servlet.ServletException: com.vaadin.flow.server.ExecutionFailedException:

======================================================================================================
Failed to determine 'npm' tool.
Please install it either:
  - by following the https://nodejs.org/en/download/ guide to install it globally
  - or by running the frontend-maven-plugin goal to install it in this project:
  $ mvn com.github.eirslett:frontend-maven-plugin:1.7.6:install-node-and-npm -DnodeVersion="v12.13.0"
======================================================================================================

        at com.vaadin.flow.server.startup.DevModeInitializer.initDevModeHandler(DevModeInitializer.java:293) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.spring.VaadinServletContextInitializer$DevModeServletContextListener.contextInitialized(VaadinServletContextInitializer.java:344) ~[vaadin-spring-12.1.2.jar!/:na]

        ... 45 common frames omitted
Caused by: com.vaadin.flow.server.ExecutionFailedException:

======================================================================================================
Failed to determine 'npm' tool.
Please install it either:
  - by following the https://nodejs.org/en/download/ guide to install it globally
  - or by running the frontend-maven-plugin goal to install it in this project:
  $ mvn com.github.eirslett:frontend-maven-plugin:1.7.6:install-node-and-npm -DnodeVersion="v12.13.0"
======================================================================================================

        at com.vaadin.flow.server.frontend.TaskRunNpmInstall.runNpmInstall(TaskRunNpmInstall.java:82) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.server.frontend.TaskRunNpmInstall.execute(TaskRunNpmInstall.java:55) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.server.frontend.NodeTasks.execute(NodeTasks.java:430) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.server.startup.DevModeInitializer.initDevModeHandler(DevModeInitializer.java:282) ~[flow-server-2.1.2.jar!/:2.1.2]

        ... 46 common frames omitted
Caused by: java.lang.IllegalStateException:

======================================================================================================
Failed to determine 'npm' tool.
Please install it either:
  - by following the https://nodejs.org/en/download/ guide to install it globally
  - or by running the frontend-maven-plugin goal to install it in this project:
  $ mvn com.github.eirslett:frontend-maven-plugin:1.7.6:install-node-and-npm -DnodeVersion="v12.13.0"
======================================================================================================

        at com.vaadin.flow.server.frontend.FrontendUtils.getExecutable(FrontendUtils.java:369) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.server.frontend.FrontendUtils.getNpmExecutable(FrontendUtils.java:324) ~[flow-server-2.1.2.jar!/:2.1.2]

        at com.vaadin.flow.server.frontend.TaskRunNpmInstall.runNpmInstall(TaskRunNpmInstall.java:79) ~[flow-server-2.1.2.jar!/:2.1.2]

        ... 49 common frames omitted

2020-01-22 15:14:10.782 ERROR 11465 --- [           main]
 o.apache.catalina.core.StandardContext   : One or more listeners failed to start. Full details will be found in the appropriate container log file
2020-01-22 15:14:10.784 ERROR 11465 --- [           main]
 o.apache.catalina.core.StandardContext   : Context [] startup failed due to previous errors
2020-01-22 15:14:10.877  INFO 11465 --- [           main]
 o.apache.catalina.core.StandardService   : Stopping service [Tomcat]

2020-01-22 15:14:10.900  WARN 11465 --- [           main]
 ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2020-01-22 15:14:10.932  INFO 11465 --- [           main]
 ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-01-22 15:14:10.939 ERROR 11465 --- [           main]
 o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:156) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140) [spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at com.rubean.phonepos.ui.PersoServerApplication.main(PersoServerApplication.java:16) [classes!/:1.0-SNAPSHOT]

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_232]

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_232]

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_232]

        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_232]

        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) [user-interface.jar:1.0-SNAPSHOT]

        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) [user-interface.jar:1.0-SNAPSHOT]

Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:124) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:416) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:180) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        ... 15 common frames omitted
Caused by: java.lang.IllegalStateException: StandardEngine[Tomcat]
.StandardHost[localhost]
.TomcatEmbeddedContext[] failed to start
        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.rethrowDeferredStartupExceptions(TomcatWebServer.java:169) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:108) ~[spring-boot-2.1.7.RELEASE.jar!/:2.1.7.RELEASE]

        ... 20 common frames omitted

the pom.xml is:

<?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>

    <artifactId>ui</artifactId>
    <name>web-ui</name>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <vaadin-bom.version>14.1.3</vaadin-bom.version>
        <spring-boot-maven-plugin.version>2.2.2.RELEASE</spring-boot-maven-plugin.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
    </parent>
    <pluginRepositories>
        <pluginRepository>
            <id>vaadin-prereleases</id>
            <url>https://maven.vaadin.com/vaadin-prereleases</url>
        </pluginRepository>
    </pluginRepositories>

    <repositories>
        <repository>
            <id>vaadin-prereleases</id>
            <url>https://maven.vaadin.com/vaadin-prereleases</url>
        </repository>
        <!-- Repository used by many Vaadin add-ons -->
        <repository>
            <id>Vaadin Directory</id>
            <url>http://maven.vaadin.com/vaadin-addons</url>
        </repository>
    </repositories>

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

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-maven-plugin.version}</version>
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>production-mode</id>
            <activation>
                <property>
                    <name>vaadin.productionMode</name>
                </property>
            </activation>
            <properties>
                <vaadin.productionMode>true</vaadin.productionMode>
            </properties>

            <dependencies>
                <dependency>
                    <groupId>com.vaadin</groupId>
                    <artifactId>flow-server-production-mode</artifactId>
                </dependency>
            </dependencies>

            <build>
                <plugins>
                    <plugin>
                        <groupId>com.vaadin</groupId>
                        <artifactId>vaadin-maven-plugin</artifactId>
                        <version>${vaadin-bom.version}</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>copy-production-files</goal>
                                    <goal>package-for-production</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <jvmArguments>-Dvaadin.productionMode</jvmArguments>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Perhaps it is due to the server’s local policies that I want to run the JAR file there. Should I manually copy the node_modules there to prevent them from being installed in runtime?

Hi!

If you want to run it locally for development, do as suggested in the error message: install npm locally. You can follow instructions of npm or do that “project locally” by issuing Maven command:

mvn com.github.eirslett:frontend-maven-plugin:1.7.6:install-node-and-npm -DnodeVersion="v12.13.0"

If you doing actual deployment (or for staging server or similar), you should do production build to get client side resources built up front. Then npm isn’t needed at runtime at all. But to do the actual build, you’ll need npm. With your build script, use the profile production-mode:

mvn install -P production-mode

cheers,
Matti