¿Cómo agregar bibliotecas JAR al proyecto WAR sin enfrentar java.lang.ClassNotFoundException? Classpath vs Build Path vs /WEB-INF/lib

Resuelto asked hace 13 años • 4 respuestas

¿Cómo debo agregar bibliotecas JAR a un proyecto WAR en Eclipse sin enfrentar java.lang.ClassNotFoundExceptionojava.lang.NoClassDefFoundError ?

La CLASSPATHvariable de entorno no parece funcionar. En algunos casos, agregamos archivos JAR a la propiedad Build Path del proyecto Eclipse para compilar el código. A veces necesitamos poner archivos JAR dentro/WEB-INF/lib la carpeta de la aplicación web Java EE para que el código se ejecute en las clases dentro de ese JAR.

No entiendo exactamente por qué CLASSPATHno funciona y en qué casos debemos agregar JAR a Build Path y cuándo exactamente se deben colocar esos JAR /WEB-INF/lib.

 avatar Jul 22 '11 22:07
Aceptado

La variable de entorno CLASSPATHsolo la usa el java.execomando e incluso entonces solo cuando el comando se invoca sin ninguno de los -cpargumentos . Los IDE como Eclipse, Netbeans e IDEA ignoran la variable de entorno. Consulte también java.lang.ClassNotFoundException a pesar de utilizar la variable de entorno CLASSPATH-classpath-jarCLASSPATH .

La ruta de compilación es solo para bibliotecas que son necesarias para compilar el código del proyecto. Colocar manualmente el JAR /WEB-INF/lib, configurar el Ensamblaje de implementación , o permitir que un sistema de compilación externo como Maven coloque el <dependency>JAR /WEB-INF/libdel WAR producido durante la compilación, es solo para bibliotecas que deben obtener el código para implementarlo y ejecutarlo en el entorno de destino. también. Tenga en cuenta que se supone que no debe crear subcarpetas en/WEB-INF/lib . Los JAR deben colocarse en la raíz.

Algunas bibliotecas ya las proporciona el servidor JEE o el contenedor de servlet de destino, como JSP, Servlet, EL, etc. Por lo tanto, no es necesario colocar archivos JAR de esas bibliotecas en formato /WEB-INF/lib. Además, sólo causaría problemas de carga de clases. Es suficiente especificarlos (indirectamente) únicamente en Build Path . En Eclipse, normalmente lo hace configurando el tiempo de ejecución objetivo en consecuencia. Terminará automáticamente en Build Path . No es necesario agregarlos manualmente a Build Path . Consulte también ¿Cómo importo la API javax.servlet/jakarta.servlet en mi proyecto Eclipse?

Otras bibliotecas, generalmente de terceros, como Apache Commons, controladores JDBC y bibliotecas JEE que no son proporcionadas por el contenedor de servlet de destino (por ejemplo, Tomcat no admite muchas bibliotecas JEE listas para usar, como JSF, JSTL, CDI, JPA, EJB, etc. ), deben terminar en /WEB-INF/lib. Puedes simplemente copiar y pegar los archivos JAR físicos allí. No es necesario que lo especifique en Build Path . Quizás solo cuando ya lo tenga como Biblioteca de usuario , pero entonces debería usar la configuración de ensamblaje de implementación para esto. Consulte también ClassNotFoundException cuando utilice bibliotecas de usuario en la ruta de compilación de Eclipse .

En caso de que esté utilizando Maven, debe asegurarse absolutamente de marcar las bibliotecas como <scope>provided</scope>si ya estuvieran proporcionadas por el tiempo de ejecución de destino, como JEE, Servlet, EL, etc. en caso de que implemente en WildFly, TomEE, etc. De esta manera, no terminarán en /WEB-INF/libel WAR producido (y potencialmente causarán conflictos con las bibliotecas incluidas en el servidor), pero terminarán en la ruta de compilación de Eclipse (y obtendrán el código del proyecto para compilar). Consulte también ¿Cómo instalar y configurar correctamente las bibliotecas JSF a través de Maven?

BalusC avatar Jul 22 '2011 16:07 BalusC

Se hace referencia a esos archivos JAR en la ruta de compilación únicamente para el proceso de compilación. Si exporta su aplicación web, no se incluyen en el WAR final (pruébelo).

Si necesita los JAR en tiempo de ejecución, debe colocarlos en WEB-INF/lib o en el classpath del servidor. Colocar sus JAR en el classpath del servidor solo tiene sentido si varios WAR comparten una base de código común y tienen la necesidad de acceder a objetos compartidos (por ejemplo, un Singleton).

home avatar Jul 22 '2011 15:07 home