Si tenemos java 6 y estamos haciendo web services, con apache CXF por ejemplo, y obtenemos errores extraños con la versión de Jaxb-api, como estos
Exception in thread "main" java.lang.LinkageError: JAXB 2.0 API is being loaded
from the bootstrap classloader, but this RI (from jar:file:/D:/work/jaxws-ri/lib/jaxb-impl.jar!
/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API.
Use the endorsed directory mechanism to place jaxb-api.jar
es que estamos teniendo problemas con la versión de determinadas librerías. El JDK tiene incluidas la versión 2.0 de las librerías JAXB 2.0 y JAX-WS 2.0, mientras que nuestra versión de Web Services (apache CXF por ejemplo), necesita la 2.1 (según la excepción). La forma de solucionar esto es poner las librerías JAX-WS 2.1 y JAXB 2.1 en algún sitio de forma que se encuentren antes que las de defecto del JDK.
Si nuestra aplicación es una aplicación de escritorio, debemos colocarlas en los directorios JDK_HOME/lib/endorsed o JDK_HOME/jre/lib/endorsed, según qué estemos usando.
Si nuestra aplicación corre en un contenedor web de aplicaciones, como Apache Tomcat, debemos colocarla en el sitio que nuestro servidor web tenga indicado para ello. En el caso de Tomcat, sería en CATALINA_HOME/endorsed (debemos crear el directorio si no lo está).
Existe también forma de indicarle a java dónde están los directorios "endorsed" en vez de usar los de defecto, de forma que no tendremos que tocar los directorios de instalación de Java. Podremos así meter esos dos jar en un directorio cualquiera en nuestro ordenador e indicarle a Java en el momento de arrancar la máquina virtual, que ese directorio hace de "endorsed"
java -Djava.endorsed.dirs=UN_DIRECTORIO_CUALQUIERA …
que sería válido tanto para aplicaciones de escritorio como para Tomcat.
Referencias:
http://www.java.net/external?url=http://java.sun.com/j2se/1.5.0/docs/guide/standards/
http://weblogs.java.net/blog/ramapulavarthi/archive/2007/01/problems_using.html