Connor Butch
Connor Butch

Reputation: 688

JBoss Compiles but NoClassDefFoundError on startup

I have an ejb project (built with maven) I am attempting to deploy in jboss 7.1 EAP app server (via eclipse ui). I can successfully build the jar (mvn clean install) with dependencies on a websocket implementation, as well as running a singleton bean on startup (annotating it with @Startup and putting a println in constructor works). However, when I start the server with code that uses the maven dependency, it throws a NoClassDefFoundError. Any ideas?

pom.xml source

 <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>
    <groupId>com.connor.wstest</groupId>
    <artifactId>WebSocketEJB</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>ejb</packaging>    
    <dependencies>
    <!-- official socket.io java implementation (ported from original javascript) -->
    <dependency>
      <groupId>io.socket</groupId>
      <artifactId>socket.io-client</artifactId>
      <version>1.0.0</version>
  </dependency>
  <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>  
        </dependencies> 
      <build>
        <sourceDirectory>ejbModule</sourceDirectory>
        <resources>
          <resource>
            <directory>ejbModule</directory>
            <excludes>
              <exclude>**/*.java</exclude>
            </excludes>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-ejb-plugin</artifactId>
            <version>2.5</version>
            <configuration>
              <ejbVersion>3.1</ejbVersion>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

Error Stack Trace (only occurs when deploying ejb to jboss app server and having code reference imported library):

1:13,929 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 62) MSC000001: Failed to start service jboss.deployment.unit."CryptoWs.jar".component.StartupOne.START: org.jboss.msc.service.StartException in service jboss.deployment.unit."CryptoWs.jar".component.StartupOne.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:57)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163)
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:134)
    at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:88)
    at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:124)
    at org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:138)
    at org.jboss.as.ee.component.ComponentStartService$1.run(ComponentStartService.java:54)
    ... 6 more
Caused by: javax.enterprise.inject.CreationException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.jboss.weld.security.NewInstanceAction.run(NewInstanceAction.java:33)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.jboss.weld.injection.Exceptions.rethrowException(Exceptions.java:40)
    at org.jboss.weld.injection.Exceptions.rethrowException(Exceptions.java:50)
    at org.jboss.weld.injection.Exceptions.rethrowException(Exceptions.java:90)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:127)
    at org.jboss.weld.injection.ConstructorInjectionPoint$1.proceed(ConstructorInjectionPoint.java:101)
    at org.jboss.as.weld.injection.WeldManagedReferenceFactory.create(WeldManagedReferenceFactory.java:51)
    at org.jboss.as.ee.component.ComponentInstantiatorInterceptor.processInvocation(ComponentInstantiatorInterceptor.java:67)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doLifecycleInterception(Jsr299BindingsInterceptor.java:122)
    at org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:113)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.weld.injection.WeldConstructionStartInterceptor$1.aroundConstruct(WeldConstructionStartInterceptor.java:53)
    at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallback(ConstructorInjectionPoint.java:109)
    at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:95)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78)
    at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:112)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:180)
    at org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget.produce(SessionBeanInjectionTarget.java:126)
    at org.jboss.as.weld.injection.WeldInjectionContext.produce(WeldInjectionContext.java:46)
    at org.jboss.as.weld.injection.WeldConstructionStartInterceptor.processInvocation(WeldConstructionStartInterceptor.java:37)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at org.jboss.as.ee.component.AroundConstructInterceptorFactory$1.processInvocation(AroundConstructInterceptorFactory.java:26)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.weld.interceptors.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:105)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.weld.injection.WeldInjectionContextInterceptor.processInvocation(WeldInjectionContextInterceptor.java:43)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:60)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.as.ejb3.component.singleton.StartupCountDownInterceptor.processInvocation(StartupCountDownInterceptor.java:25)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53)
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
    ... 11 more
Caused by: java.lang.NoClassDefFoundError: io/socket/client/IO
    at com.connor.StartupOne.<init>(StartupOne.java:33)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119)
    ... 50 more
Caused by: java.lang.ClassNotFoundException: io.socket.client.IO from [Module "deployment.CryptoWs.jar" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
    ... 56 more

22:41:13,950 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "CryptoWs.jar")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"CryptoWs.jar\".component.StartupOne.START" => "java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
    Caused by: javax.enterprise.inject.CreationException
    Caused by: java.lang.NoClassDefFoundError: io/socket/client/IO
    Caused by: java.lang.ClassNotFoundException: io.socket.client.IO from [Module \"deployment.CryptoWs.jar\" from Service Module Loader]"}}
22:41:14,013 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 37) WFLYSRV0010: Deployed "CryptoWs.jar" (runtime-name : "CryptoWs.jar")
22:41:14,013 INFO  [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0186:   Services which failed to start:      service jboss.deployment.unit."CryptoWs.jar".component.StartupOne.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance

Here is the code that throws the exception:

package com.connor;

import java.net.URISyntaxException;
import java.util.stream.Stream;

import javax.ejb.Asynchronous;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import io.socket.client.IO;
import io.socket.client.Socket;

/**
 * Session Bean implementation class StartupOne
 */
@Singleton
@Asynchronous
@Startup
public class StartupOne {



    /**
     * Default constructor. 
     */
    public StartupOne() {
        // TODO Auto-generated constructor stub
        Socket socket;

        System.out.println("***" + Thread.currentThread().getName());

        try {
            socket = IO.socket("wss://www.bitmex.com/realtime?subscribe=instrument"); //THIS LINE THROWS THE EXCEPTION!!!!!!


             socket
                .on(Socket.EVENT_CONNECT, args -> {
                    /*
                    Map<String, Object> eventArgs = new HashMap<>();

                    eventArgs.put("subs", Arrays.asList(subscriptions));

                    socket.emit("SubAdd", eventArgs);
                    */
                })
                .on("m", args -> Stream.of(args).forEach(arg -> {
                    // Log the raw message for debug
                    System.out.println("Raw message: "+arg);

                    //CryptoCompareResponse response = CryptoCompareResponse.unpack((String) arg);
                    //if (response.getMessageType() == 5 && (response.getFlag() == 1 || response.getFlag() == 2)) {
                    //    updatePricing(response);
                    //}
                }))
                .on(Socket.EVENT_DISCONNECT, args -> System.out.println("Received disconnect event"));

            socket.connect();   
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Upvotes: 2

Views: 1842

Answers (1)

wirnse
wirnse

Reputation: 1136

The root Exception is ClassNotFoundException and it tells you, that your deployment CryptoWs.jar can not find the class io.socket.client.IO. So where is that class? It is in the jar socket.io-client-1.0.0.jar. But where is that jar in context of jboss? The answer is, not available. Now you have different options.

  1. Create a war archive out of WebSocketEJB. The jar should then be added to the lib folder of the war archive.
  2. Create a jboss module for socket.io-client and let WebSocketEJB point to it. (manifest entry)
  3. Create an uber jar.

I would suggest you give it a try with option 1.

Upvotes: 2

Related Questions