eclipse java-ee jar classpath war

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



java-ee (4)

Esas JAR en la ruta de compilación se referencian solo para el proceso de compilación. Si exporta su Aplicación Web, no están incluidos en la GUERRA final (pruébelo).

Si necesita los JAR en tiempo de ejecución, debe colocarlos en WEB-INF / lib o classpath del servidor. Colocar los 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 los objetos compartidos (por ejemplo, un Singleton).

¿Cómo debería agregar bibliotecas JAR a un proyecto WAR en Eclipse sin enfrentar java.lang.ClassNotFoundException o java.lang.NoClassDefFoundError ?

La variable de entorno CLASSPATH 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 de /WEB-INF/lib carpeta de la aplicación web Java EE para hacer que el código se ejecute en clases dentro de ese JAR.

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


La variable de entorno CLASSPATH solo la utiliza el comando java.exe e incluso solo cuando se utiliza sin ninguno de los -cp , -classpath , -jar . Es ignorado por IDE como Eclipse, Netbeans e IDEA. Consulte también java.lang.ClassNotFoundException a pesar de utilizar la variable de entorno CLASSPATH .

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

Algunas bibliotecas ya las proporciona el servidor Java EE o servletcontainer de destino, como JSP, Servlet, EL, etc. Por lo tanto, no es necesario colocar los JAR de esas bibliotecas en /WEB-INF/lib . Además, solo causaría problemas de carga de clases. Es suficiente para (indirectamente) especificarlos solo en la ruta de compilación . En Eclipse, normalmente haces eso configurando el tiempo de ejecución objetivo según corresponda. Automáticamente terminará en Build Path . Consulte también ¿Cómo importo la API javax.servlet en mi proyecto Eclipse?

Otras bibliotecas, generalmente de terceros como Apache Commons, controladores JDBC y bibliotecas estándar no proporcionadas por el servletcontainer de destino (por ejemplo, Tomcat no admite JSF, CDI, JPA, EJB, etc.), deben terminar en /WEB-INF/lib . No necesariamente es necesario especificarlo en la ruta de compilación . Solo quizás cuando ya lo tenga como Biblioteca de usuarios , pero debe usar la configuración del ensamblaje de implementación para esto. Consulte también ClassNotFoundException al usar bibliotecas de usuario en la ruta de compilación de Eclipse .

En caso de que esté utilizando Maven, debe asegurarse de marcar las bibliotecas como <scope>provided</scope> si ya están provistas por el tiempo de ejecución de destino, como Java EE, Servlet, EL, etc. en el caso se despliega en WildFly, TomEE, etc. De esta forma no terminarán en /WEB-INF/lib de WAR producido (y pueden causar conflictos con las bibliotecas incluidas en el servidor), sino que terminarán en la ruta de compilación de Eclipse (y obtener el código del proyecto para compilar).



Si está usando Maven :

Abra las propiedades del proyecto y en Ensamblaje de despliegue, haga clic en Agregar ...

A continuación, seleccione Entradas de ruta de compilación de Java y seleccione Dependencias de Maven