One other thing which I suppose might be relevant, I compiled
this with java-8. So I suppose one of the classloaders might
not be loading the new class file format properly?
David
On Monday 06 April 2015 16:35:22 David Goodenough wrote:
> No static blocks in the code. Here is a really basic test:-
>
> RestApp.java
>
> package uk.co.dga.test;
>
> import java.util.HashSet;
> import java.util.Set;
>
> import javax.ws.rs.ApplicationPath;
> import javax.ws.rs.core.Application;
>
> @ApplicationPath("/*")
> public class RestApp extends Application {
> @Override public Set<Class<?>>getClasses() {
> Set<Class<?>>s = new HashSet<Class<?>>();
> s.add(RestEjb.class);
> return s;
> }
> }
>
> RestEjb.java
>
> package uk.co.dga.test;
>
> import javax.ejb.Stateless;
> import javax.ws.rs.POST;
> import javax.ws.rs.Path;
> import javax.ws.rs.Produces;
> import javax.ws.rs.core.MediaType;
>
> @Stateless
> @Path("/test")
> public class RestEjb {
> @POST
> @Produces(MediaType.TEXT_PLAIN)
> public String process() {
> return "Hello World";
> }
> }
>
> and the file structure in webapps/test is:-
>
> webapps/test/
>
> |-- HelloWorld
> |
> | |-- META-INF
> | |
> | | `-- MANIFEST.MF
> |
> | `-- WEB-INF
> |
> | |-- classes
> | |
> | | `-- uk
> | |
> | | `-- co
> | |
> | | `-- dga
> | |
> | | `-- test
> | |
> | | |-- RestApp.class
> | |
> | | `-- RestEjb.class
> |
> | `-- lib
>
> `-- HelloWorld.war
>
> David
>
> On Monday 06 April 2015 17:17:47 Romain Manni-Bucau wrote:
> > Hi
> >
> > Can it be a static block failing or something like that?
> >
> > Can you share a project showing it?
> > I have a JAX-RS application, and if I can I want to use the no-xml
> > configuration with annotations instead.
> >
> > So I have written the main stateless EJB with @Path, which
> > has an @POST annotated method on it, and a second class
> > derived from Application which has an @ApplicationPath annotation.
> > The Application has an overridden method:-
> >
> > @Override public Set<Class<?>>getClasses() {
> >
> > Set<Class<?>>s = new HashSet<Class<?>>();
> > s.add(Ejb.class);
> > return s;
> > }
> >
> > I then put the whole lot in a war file which contains just those
> > classes and a few others that I reference from the @POST method.
> > They all make reference to libraries that are in the {tomee}/lib
> > directory. In the war file is also a persistence.xml which defines
> > the postgresql driver and the JDBC connection info (the driver is
> > included in the war file)
> >
> > I finally put the war file in its own directory in the webapps directory
> > and start tomee (using bin/startup.sh).
> >
> > In the log file I get information which seems to say that it has
> > found everything:-
> >
> > INFO - REST Application: http://localhost:8080/test/* ->
> > uk.co.dga.test.App
> > INFO - Service URI: http://localhost:8080/test/ejb -> EJB
> > uk.co.dga.test.Ejb
> > INFO - POST http://localhost:8080/test/ejb/ -> Reply
> > process(JAXBElement<Request>)
> >
> > So it seems to have found both classes.
> >
> > Then however is starts to complain:-
> >
> > SEVERE - Error waiting for multi-thread deployment of directories to
> > complete
> > java.util.concurrent.ExecutionException: java.lang.InternalError:
> > LocalBeanProxyFactory.createProxy:
> > java.lang.reflect.InvocationTargetException
> >
> > and a whole stack trace ending with as the inner most part:-
> >
> > Caused by: java.lang.ClassNotFoundException: uk.co.dga.test.Ejb
> >
> > at
> >
> > org.apache.openejb.core.TempClassLoader.loadClass(TempClassLoader.java:186
> > )
> >
> > at
> >
> > org.apache.openejb.core.TempClassLoader.loadClass(TempClassLoader.java:83)
> >
> > ... 26 more
> >
> > How can it have found it and not found it?
> >
> > David