I have Java 8 & WildFly (JBoss) 10.0 installed. I have deployed the emsa.jar
file with a remote EJB in it on the "remote" server.
I am attempting to use JNDI to invoke a method in the EJB from within a separate client app by running the client's main method as a Java App in Eclipse, but am getting the following error:
INFO: EJBCLIENT000013: Successful version handshake completed for receiver context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@61f8bee4, receiver=Remoting connection EJB receiver [connection=Remoting connection <545ebbdd>,channel=jboss.ejb,nodename=skb]} on channel Channel ID d234d46a (outbound) of Remoting connection 395b72b3 to localhost/127.0.0.1:8080
Exception in thread "naming-client-message-receiver-1-thread-1" java.lang.NoClassDefFoundError: javax/ejb/EJBException
at org.jboss.ejb.client.SerializedEJBInvocationHandler.readResolve(SerializedEJBInvocationHandler.java:110)
at org.jboss.ejb.client.SerializedEJBInvocationHandler.readResolve(SerializedEJBInvocationHandler.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.jboss.marshalling.reflect.SerializableClass.callReadResolve(SerializableClass.java:417)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1299)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:213)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadNestedObject(RiverUnmarshaller.java:169)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1254)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:213)
at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:45)
at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:156)
at org.jboss.naming.remote.protocol.v1.Protocol$1$3.read(Protocol.java:149)
at org.jboss.naming.remote.protocol.v1.BaseProtocolCommand.readResult(BaseProtocolCommand.java:59)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleClientMessage(Protocol.java:149)
at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1$MessageReceiver$1.run(RemoteNamingStoreV1.java:232)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: javax.ejb.EJBException
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)
... 23 more
javax.naming.NamingException: Unable to invoke lookup, status=WAITING
at org.jboss.naming.remote.protocol.v1.Protocol$1.execute(Protocol.java:98)
at org.jboss.naming.remote.protocol.v1.RemoteNamingStoreV1.lookup(RemoteNamingStoreV1.java:95)
at org.jboss.naming.remote.client.HaRemoteNamingStore$1.operation(HaRemoteNamingStore.java:276)
at org.jboss.naming.remote.client.HaRemoteNamingStore.namingOperation(HaRemoteNamingStore.java:132)
at org.jboss.naming.remote.client.HaRemoteNamingStore.lookup(HaRemoteNamingStore.java:272)
at org.jboss.naming.remote.client.RemoteContext.lookupInternal(RemoteContext.java:104)
at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:93)
at org.jboss.naming.remote.client.RemoteContext.lookup(RemoteContext.java:146)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.kelly_ann.employeemgmt.Main.main(Main.java:38)
The code in the client's Main class is:
package com.k_a.employeemgmt;
import java.util.List;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.k_a.employeemgmt.EmployeeMgmtService;
import com.k_a.employeemgmt.domain.Employee;
public class Main {
// this remotely invokes the server's EmployeeMgmtService.getAllEmployees() method.
public static void main(String[] args) {
try {
Properties jndiProperties = new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
jndiProperties.put("jboss.naming.client.ejb.context", true);
System.out.println("MYTESTjndiProperties: " + jndiProperties); // gets here
Context jndi = new InitialContext(jndiProperties);
System.out.println("MYTESTjndi: " + jndi); // gets here
EmployeeMgmtService service = (EmployeeMgmtService)jndi.lookup("emsa/EmployeeMgmtImpl!com.k_a.employeemgmt.EmployeeMgmtService");
System.out.println("MYTESTservice: " + service); // doesn't get to here
List<Employee> employees = service.getAllEmployees();
for(Employee employee : employees) {
System.out.println(employee);
}
}
My client application's Gradle build file (build.gradle
) has the following dependencies in it:
apply plugin: 'java'
defaultTasks 'clean', 'compileJava', 'test', 'jar'
jar {
archiveName = "emtc.jar"
}
test.useJUnit()
repositories {
mavenCentral()
}
dependencies {
compile 'jboss:jboss-client:4.0.2'
compile 'org.jboss:jboss-remote-naming:2.0.4.Final'
compile 'org.jboss.xnio:xnio-nio:3.3.6.Final'
testCompile 'junit:junit:4.12'
}
I have tried following the WildFly/JBoss docs here for the last day but with no luck.
Any ideas?
Final solution:
The issue was my Gradle build.gradle file I needed to apply the 'application'
plugin listed here and call the 'run'
task. Once that was done it worked like a charm! Ended up using the maven repository BOM (from here) in Gradle build file too since that was the best way to ensure proper dependency management. Thanks for all the help! Much appreciated. :-)
Final code in the build.gradle
file is below:
apply plugin: 'java'
apply plugin: 'application'
defaultTasks 'clean', 'compileJava', 'test', 'jar', 'run'
mainClassName = 'com.k_a.employeemgmt.Main'
jar {
archiveName = "emtc.jar"
}
test.useJUnit()
repositories {
mavenCentral()
}
dependencies {
compile 'org.wildfly:wildfly-ejb-client-bom:10.0.0.Final'
testCompile 'junit:junit:4.12'
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments