proyecto - maven tutorial pdf
¿Cómo instalar y configurar correctamente las bibliotecas JSF a través de Maven? (1)
Cuando se enfrenta a una excepción "extraña" que sugiere que las clases / métodos / archivos / componentes / etiquetas están ausentes o son diferentes, mientras que se incluyen explícitamente en la aplicación web, como las siguientes,
java.lang.ClassFormatError: atributo de código ausente en el método que no es nativo o abstracto en el archivo de clase javax / faces / webapp / FacesServlet
java.util.MissingResourceException: no se puede encontrar el paquete javax.faces.LogStrings
com.sun.faces.vendor.WebContainerInjectionProvider no se puede convertir en com.sun.faces.spi.InjectionProvider
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED
La etiqueta denominada inputFile del espacio de nombres http://xmlns.jcp.org/jsf/html tiene definida una clase de controlador nulo.
java.lang.NullPointerException en javax.faces.CurrentThreadToServletContext.getFallbackFactory
o cuando enfrenta un comportamiento de tiempo de ejecución "extraño" como sesiones HTTP rotas ( jsessionid
aparece en URLs de enlace en todo el lugar), y / o ámbito de vista JSF roto (se comporta como ámbito solicitado), y / o CSS / JS / roto recursos de imagen, entonces existe la posibilidad de que el classpath de tiempo de ejecución de la aplicación web esté contaminado con archivos JAR versionados duplicados.
En su caso específico con FacesServlet
, significa que el archivo JAR que contiene la clase mencionada se ha encontrado por primera vez como un archivo JAR API "blueprint", destinado a proveedores de implementación (como desarrolladores que trabajan para Mojarra y MyFaces). Contiene archivos de clase con solo firmas de clase y método, sin cuerpos de código y archivos de recursos. Eso es exactamente lo que significa "atributo de código ausente". Es puramente útil para javadocs y compilación.
Siempre marque las bibliotecas proporcionadas por el servidor tal como se provided
Todas las dependencias marcadas como " Especificaciones de Java " en Maven y que tienen -api
sufijo -api
en el ID del artefacto son aquellas API de blueprint. No debería tenerlos en el classpath en tiempo de ejecución. Siempre debe marcar <scope>provided</scope>
si realmente necesita tenerlo en su pom. Un ejemplo bien conocido es la API de Java EE (Web) :
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version><!-- 6.0 or 7.0 or newer --></version>
<scope>provided</scope>
</dependency>
Si el alcance provided
está ausente, entonces este JAR terminará en webapp /WEB-INF/lib
, causando todos los problemas que enfrenta ahora. Este JAR también contiene la clase de plano de FacesServlet
.
En su caso específico, tiene una dependencia innecesaria API JSF :
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
</dependency>
Esto causa problemas porque contiene la clase de modelo de FacesServlet
. Quitarlo y confiar en una API Java EE (Web) proporcionada como se muestra arriba debería resolverlo.
Tomcat como un contenedor barebones JSP / Servlet ya proporciona JSP, Servlet y EL (y desde 8 también WebSocket). Por lo tanto, debe marcar al menos jsp-api
, servlet-api
y el-api
, provided
como se el-api
. Tomcat solo no proporciona JSF (y JSTL ) fuera de la caja. Entonces necesitarías instalarlo a través de la aplicación web.
Los servidores completos de Java EE como WildFly, TomEE, GlassFish, Payara, WebSphere, etc. ya proporcionan toda la API de Java EE, incluido JSF. Por lo tanto, no es necesario que instale JSF a través de la aplicación web. Solo daría lugar a conflictos si el servidor ya proporciona una implementación y / o versión diferente de la caja. La única dependencia que necesita es javaee-web-api
exactamente como se muestra aquí arriba.
Instalando JSF en Tomcat
La forma correcta de instalar JSF en Tomcat se menciona en nuestra wiki JSF - Instalación de JSF . Hay 2 implementaciones JSF, Mojarra y MyFaces . Debe elegir instalar uno de ellos y, por lo tanto, no ambos.
Instalando Mojarra en Tomcat:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version><!-- Check https://javaserverfaces.github.io --></version>
</dependency>
También puede consultar el repositorio de org.glassfish:javax.faces
para ver la última versión (que actualmente es 2.2.13
). Ver también las instrucciones de instalación de Mojarra .
Instalando MyFaces en Tomcat:
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version><!-- Check http://myfaces.apache.org --></version>
</dependency>
También puede consultar el repositorio de org.apache.myfaces.core:myfaces-bundle
para ver la versión actual más reciente (que actualmente es 2.2.10
).
Tenga en cuenta que Tomcat 6 como contenedor Servlet 2.5 admite max JSF 2.1. No te olvides de instalar JSTL junto, por cierto. Vea también nuestra wiki JSF - Instalación de JSF .
Ver también:
Estoy intentando implementar una aplicación basada en JSF para Tomcat 6. La forma en que mi sistema de compilación está configurado, el WAR en sí mismo no tiene bibliotecas, porque este servidor está sirviendo un total de 43 aplicaciones. En cambio, las bibliotecas se copian en una carpeta de biblioteca compartida y se comparten entre las aplicaciones. Cuando implemente, obtengo este error
SEVERE: Error deploying configuration descriptor SSOAdmin.xml
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/faces/webapp/FacesServlet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1667)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1078)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4611)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Ahora en mi investigación, veo que se supone que esto se resuelve descargando el código fuente JSF y compilándolo yo mismo. Esa es una solución horrible en mi caso. Eso causará grandes problemas en mi equipo con las diversas configuraciones con las que tenemos que lidiar. ¿Hay otra solución para esto?
Aquí está mi pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nms.sso</groupId>
<artifactId>SSOAdmin</artifactId>
<version>09142011-BETA</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<!-- <dependency> -->
<!-- <groupId>com.sun.faces</groupId> -->
<!-- <artifactId>jsf-api</artifactId> -->
<!-- <scope>${myExeScope}</scope> -->
<!-- </dependency> -->
<!-- <dependency> -->
<!-- <groupId>com.sun.faces</groupId> -->
<!-- <artifactId>jsf-impl</artifactId> -->
<!-- <scope>${myExeScope}</scope> -->
<!-- </dependency> -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>net.sf.jt400</groupId>
<artifactId>jt400</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>nmsc</groupId>
<artifactId>nmsc_api</artifactId>
<version>09142011-BETA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.icefaces</groupId>
<artifactId>icefaces</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.icefaces</groupId>
<artifactId>icefaces-ace</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.icefaces</groupId>
<artifactId>icefaces-compat</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-extras</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>${myExeScope}</scope>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>${myExeScope}</scope>
</dependency>
</dependencies>
<parent>
<groupId>nmsc</groupId>
<artifactId>nmsc_lib</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../libs</relativePath>
</parent>
<build>
<finalName>SSOAdmin</finalName>
</build>
<name>SSOAdmin Maven Webapp</name>
</project>
Tiene que haber una solución aquí. No puedo creer por un segundo que Maven distribuible para JSF solo sea bueno para la compilación y no sea bueno para la implementación.