Alexei
Alexei

Reputation: 15726

Vaadin 7.7.16 -> java.lang.ClassNotFoundException: com.vaadin.server.VaadinServlet

On Vaadin 7.3.6 this code work fine:

 import org.apache.log4j.Logger;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.webapp.WebAppContext; this work fine
    import org.apache.log4j.Logger;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.webapp.WebAppContext;

        private void start() {
            try {
                WebAppContext context = new WebAppContext();
                Server server = new Server(port);

                String descriptor = getClass().getResource("/web.xml").toString();

                context.setDescriptor(descriptor);
                context.setResourceBase("classpath");
                context.setParentLoaderPriority(true);
                if (ProxyConfig.secureCookies())
                    context.getSessionHandler().getSessionManager().getSessionCookieConfig().setSecure(true);
                server.setSendServerVersion(false);
                server.setHandler(context);

                BackendService.getInstance();
                server.start(); // ERROR HERE
                server.join();
            } catch (Throwable e) {
                logger.error(e.getMessage(), e);
            }
        }

But on Vaadin 7.7.16 I get error:

[ERROR] 27.02.2019 20:26:33.375 [main] myproject.client.AppStarter.start(AppStarter.java:42)
    com/vaadin/server/VaadinServlet
java.lang.NoClassDefFoundError: com/vaadin/server/VaadinServlet
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:407)
        at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:100)
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:79)
        at org.eclipse.jetty.servlet.Holder.doStart(Holder.java:107)
        at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:298)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:791)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95)
        at org.eclipse.jetty.server.Server.doStart(Server.java:282)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
        at myproject.client.AppStarter.start(AppStarter.java:35)
        at myproject.client.AppStarter.<init>(AppStarter.java:56)
        at myproject.client.AppStarter.main(AppStarter.java:61)
Caused by: java.lang.ClassNotFoundException: com.vaadin.server.VaadinServlet
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 31 more
[DEBUG] 27.02.2019 20:26:38.255 [DICTIONARY_SYNC] myproject.client.service.DictionaryService$1.run(DictionaryService.java:38)

Upvotes: 0

Views: 1188

Answers (1)

codinghaus
codinghaus

Reputation: 2358

Caused by: java.lang.ClassNotFoundException: com.vaadin.server.VaadinServlet

The class that is obviously not found on the class path (VaadinServlet) is contained in vaadin-server-7.7.16.jar. You must ensure that this library is on your class path when starting your application.

I created a minimum example project (maven) based on the maven archetype vaadin-archetype-aaplication by command:

mvn archetype:generate \
   -DarchetypeGroupId=com.vaadin \
   -DarchetypeArtifactId=vaadin-archetype-application \
   -DarchetypeVersion=7.7.16 \
   -DgroupId=com.pany \
   -DartifactId=project-name \
   -Dversion=0.1 \
   -Dpackaging=war

and added your code in UI.init(VaadinRequest vaadinRequest) (+ I added a dependency for jetty-webapp to get the imports resolved).

If I have the following dependency in my pom.xml

    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-server</artifactId>
    </dependency>

(which it is by default in that archetype)

I can run/start the app without any problems.

If I know force that the vaadin-server dependency is not added to the class path (by marking it as provided)

    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-server</artifactId>
        <scope>provided</scope>
    </dependency>

Then when trying to start the app it fails with:

[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.3.9.v20160517:run (default-cli) on project project-name: Execution default-cli of goal org.eclipse.jetty:jetty-maven-plugin:9.3.9.v20160517:run failed: A required class was missing while executing org.eclipse.jetty:jetty-maven-plugin:9.3.9.v20160517:run: com/vaadin/server/VaadinServlet

because the mentioned class is no longer on the class path.

Upvotes: 1

Related Questions