Orden de cargar archivos jar desde el directorio lib

¿Podría alguien explicar el orden en que los archivos jar se cargan desde el directorio lib dentro de Tomcat? ¿Es alfabético? ¿Aleatorio? O alguna otra orden?

Todo está descrito en Tomcat’s ClassLoading HOW-TO . No es necesariamente en orden alfabético. Si observaste ese comportamiento, no debes confiar en él si pretendes mantener tu webapp portátil en todos los servidores. Por ejemplo, Tomcat 6 “casualmente” lo ordena, pero Tomcat 8 no.

Resumido, el orden de carga es el siguiente:

  1. bootstrap / system ( JRE/lib , luego server.loader )
  2. bibliotecas de aplicaciones web ( WEB-INF/classes , luego WEB-INF/lib )
  3. bibliotecas comunes ( common.loader , luego Tomcat/lib )
  4. bibliotecas compartidas de aplicaciones ( shared.loader )

Si desea garantizar que JAR X se cargue después de JAR Y, deberá colocar JAR X en uno de los lugares que aparecen más adelante en la lista anterior.

Sin embargo, hay excepciones, que se mencionan en los documentos tomcat

Por último, el cargador de clases de la aplicación web siempre delegará primero para las clases API de JavaEE las especificaciones implementadas por Tomcat (Servlet, JSP, EL, WebSocket). Todos los otros cargadores de clase en Tomcat siguen el patrón de delegación habitual.

Eso significa que si una aplicación web contiene cualquier clase de JavaEE ( javax.* ), Será ignorada por tomcat.

Para cada cargador, la JVM acaba de cargar las clases en el orden en que deben importarse / ejecutarse y aún no están cargadas.

¡En realidad, es un orden alfabético! (Dentro de un directorio específico, por ejemplo, el directorio ‘lib’ que menciona el póster original).

Más específicamente, si nos fijamos en la fuente de Tomcat 6, en la clase FileDirContext , el método list() llama a Arrays.sort() en la matriz de nombres de archivos de jar que se encuentran.

He probado esto manualmente también. Creo una guerra con un JSP que llama a HelloWorld.getGreeting() , y pongo dos flasks casi idénticos que contienen versiones ligeramente diferentes de HelloWorld en el directorio WEB-INF / lib. Uno dice “Hola, mundo”, el otro “Adiós, mundo cruel”.

Si nombro la versión “Hola, mundo” a.jar, y la versión “adiós” b.jar, y reinicio Tomcat, obtengo el texto “Hola”. Si nombro los jarrones al revés y reinicio Tomcat, aparece el texto “Adiós”.

Hasta donde he podido determinar, este comportamiento NO está documentado, NO está especificado y NO se debe confiar en él. Pero es alfabético, por ahora.

Ordene los flasks cargados en la carpeta WEb-INF / lib.

Para Tomcat 5-7 el orden es alfabético. Utiliza el género.

Para tomcat 8 se decide al azar por el sistema de archivos subyacente.

https://issues.apache.org/bugzilla/show_bug.cgi?id=57129

Estoy totalmente de acuerdo con la respuesta proporcionada por BalusC. El único punto para agregar es cuando se trata de cargar un JAR del respectivo cargador de clases, pero verifica el orden alfabético.

Tuve una situación para cargar “XSSFWorkbook” en mi aplicación web para leer datos de la hoja de Excel y tenía dos JARS “poi-ooxml-3.9.jar” y “org.eclipse.birt.runtime_4.3.1.v20130918-1142.jar” con el mismo nombre de clase y la estructura del paquete. Simplemente quedé más tarde, así que en su orden alfabético viene al lado del anterior y me hizo un truco. Solo quería compartir lo mismo.

Buena suerte