usar para online leer lector con como codigo celular barras annotations jetty embedded-jetty

annotations - para - No se puede hacer que Jetty escanee las clases anotadas



leer codigo de barras con celular php (6)

Basándome en el ejemplo anterior proporcionado por Joakim, cargué una versión modificada que admite anotaciones en un embarcadero integrado sin empaquetar el proyecto en un archivo de guerra. Este proyecto está listo para implementarse en Heroku simplemente ejecutándose:

$java -cp target/classes:"target/dependency/*" com.example.Launcher

Si está interesado en los detalles, las líneas importantes son estas de com.example.Launcher:

context.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebXmlConfiguration(), new WebInfConfiguration(), new PlusConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration() }); // Important! make sure Jetty scans all classes under ./classes looking for annotations. //''Classes'' directory is generated running ''mvn package'' context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",".*/classes/.*");

Puede cambiar en consecuencia el JarPattern en función de las clases que desee escanear en busca de anotaciones.

Aquí tiene el ejemplo completo: https://github.com/pablormier/embedded-jetty-annotations-example

Tengo una aplicación con un servidor jetty integrado que estoy iniciando así (colocado en main () y lanzado con eclipse):

Server server = new Server(port); WebAppContext context = new WebAppContext(); context.setResourceBase("web/"); context.setDescriptor("web/WEB-INF/web.xml"); context.setConfigurations(new Configuration[]{ new AnnotationConfiguration(), new WebXmlConfiguration(), new WebInfConfiguration(), new TagLibConfiguration(), new PlusConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration()}); context.setContextPath("/"); context.setParentLoaderPriority(true); server.setHandler(context); server.start(); server.join();

Mi web.xml tiene este aspecto (vacío por ahora, no estoy seguro de poder eliminarlo por completo):

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="false" version="3.0"> </web-app>

Y tengo una clase simple configurada así:

import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns={"/test"}) public class TestServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/html/index.html").forward(request,response); } }

Mi aplicación funciona bien cuando uso asignaciones de servlets tradicionales en web.xml. Pero cuando elimino las asignaciones web.xml y uso anotaciones, solo obtengo 404s. No parece que esté buscando anotaciones en absoluto. La consola se ve así:

2012-08-01 17:40:37.021:INFO:oejs.Server:jetty-8.1.5.v20120716 2012-08-01 17:40:37.227:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one. 2012-08-01 17:40:37.294:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/} 2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/} 2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/} 2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/} 2012-08-01 17:40:37.641:INFO:oejs.AbstractConnector:Started [email protected]:8080

Algunas cosas que he comprobado ya de mi investigación:

  • servlet-3.0 jar está en el classpath
  • conjunto de metadatos a falso en web.xml
  • Me aseguré de incluir AnnotationConfiguration en el contexto de la aplicación web

Me he quedado sin ideas y estoy a punto de volver al antiguo web.xml, pero me está matando por qué no puedo hacer que esto funcione.


En nuestro caso estas líneas ayudaron en el código de inicio de Jetty:

ClassList cl = Configuration.ClassList.setServerDefault(server); cl.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");


He ideado un enfoque diferente más bien específico para Jetty & Spring. En lugar de dejar que Jetty startContext() clases, llamé manualmente las clases de initializer en el método startContext() de un Jetty ServletContextHandler personalizado. El código es el siguiente:

public class CustomServletContextHandler extends ServletContextHandler { @Override protected void startContext() throws Exception { SpringServletContainerInitializer initer = new SpringServletContainerInitializer(); HashSet<Class<?>> classes = new HashSet<>(); // Add annotated classes here such as //classes.add(SpringSecurityInitializer.class); //classes.add(SpringWebInitilializer.class); try { initer.onStartup(classes, this.getServletContext()); }catch(Exception e) { e.printStackTrace(); } super.startContext(); } }

Y luego, al crear contexto, use un controlador personalizado:

ServletContextHandler ctx = new CustomServletContextHandler(); ctx.setContextPath("/"); ...


Tuve este mismo problema, pero después de muchas lecturas obtuve la solución! IMPORTANTE: recuerda tener en tu ruta de compilación los siguientes frascos:

jetty-all-9.0.6.v20130930.jar

jetty-anotaciones-9.0.6.v20130930.jar

org.objectweb.asm-3.1.0.v200803061910.jar

javax.servlet-api-3.0.1.jar

jetty-plus-9.0.6.v20130930.jar

public class Main { public static void main(String[] args) throws Exception { //Create the server Server server = new Server(8080); ClassList clist = ClassList.setServerDefault(server); //clist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.PlusConfiguration"); clist.addBefore(JettyWebXmlConfiguration.class.getName(), AnnotationConfiguration.class.getName()); //Here is the trick to scan current classpath! webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/build/classes/"); webapp.setContextPath("/"); webapp.setResourceBase("./WebContent"); server.setHandler(webapp); server.start(); server.join(); } }


AnntationConfiguration clase AnntationConfiguration analiza las anotaciones a través de su scanForAnnotations(WebAppContext) . En el método AnnotationConfiguration clase explora la siguiente ruta.

  • frascos de contenedores
  • WEB-INF / clases
  • WEB-INF / libs

Entonces, si desea que se analicen sus clases de servlet en su código de producción (es decir, las fuentes en el directorio src/main/java ), agregue su código de producción en los metadatos de WebAppContext como WEB-INF/classes .

Intente el siguiente código para agregar su código a los metadatos de WebAppContext .

URL classes = getClass() .getProtectionDomain() .getCodeSource() .getLocation(); WebAppContext context = new WebAppContext(); context.getMetaData() .setWebInfClassesDirs( Arrays.asList(Resource.newResource(classes)));


Actualización: Junio ​​2015

El proyecto de ejemplo se ha actualizado para Jetty 9 y Servlet 3.1.

Consulte: https://github.com/jetty-project/embedded-servlet-3.1

Respuesta original:

A partir de su descripción, y de un proyecto de muestra que hice con su código, está haciendo todo correctamente.

Proyecto de ejemplo: https://github.com/jetty-project/embedded-servlet-3.0

Para que esto funcione, querrá lo siguiente (solo mencione esto porque su pregunta no incluyó este detalle)

  • JDK 1.6+
  • jetty-webapps jar (+ dependencias) de Jetty 8.1.x (o más reciente)
  • jetty-anotaciones jar (+ dependencias) de Jetty 8.1.x (o más reciente)

Solo a partir de estos requisitos limitados verá la siguiente lista de dependencias presente.

$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building sample-webapp 1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ sample-webapp --- [INFO] com.company.sample:sample-webapp:war:1-SNAPSHOT [INFO] +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:provided [INFO] +- org.eclipse.jetty:jetty-webapp:jar:8.1.5-SNAPSHOT:test [INFO] | +- org.eclipse.jetty:jetty-xml:jar:8.1.5-SNAPSHOT:test [INFO] | | /- org.eclipse.jetty:jetty-util:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty:jetty-servlet:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty:jetty-security:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty:jetty-server:jar:8.1.5-SNAPSHOT:test [INFO] | +- org.eclipse.jetty:jetty-continuation:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty:jetty-http:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty:jetty-io:jar:8.1.5-SNAPSHOT:test [INFO] /- org.eclipse.jetty:jetty-annotations:jar:8.1.5-SNAPSHOT:test [INFO] +- org.eclipse.jetty:jetty-plus:jar:8.1.5-SNAPSHOT:test [INFO] | +- org.eclipse.jetty.orbit:javax.transaction:jar:1.1.1.v201105210645:test [INFO] | /- org.eclipse.jetty:jetty-jndi:jar:8.1.5-SNAPSHOT:test [INFO] | /- org.eclipse.jetty.orbit:javax.mail.glassfish:jar:1.4.1.v201005082020:test [INFO] | /- org.eclipse.jetty.orbit:javax.activation:jar:1.1.0.v201105071233:test [INFO] +- org.eclipse.jetty.orbit:javax.annotation:jar:1.1.0.v201108011116:test [INFO] /- org.eclipse.jetty.orbit:org.objectweb.asm:jar:3.1.0.v200803061910:test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.771s [INFO] Finished at: Fri Aug 10 18:17:46 MST 2012 [INFO] Final Memory: 6M/180M [INFO] ------------------------------------------------------------------------

Es muy probable que solo falte un requisito de dependencia o JDK.