2010-05-19 5 views
7

¿Es cierta esta afirmación:no use com.sun.xml.internal. *?

paquete com.sun.xml.internal es un paquete interno como las suggestes nombre. Los usuarios no deben escribir código que dependa de las clases de implementación de JDK internas. Estas clases son detalles de implementación interna de JDK y sujetas a cambios sin previo aviso

Uno de mis colegas utilizaron una de las clases en su código, lo que causó la tarea javac en Ant fallan para compilar nuestro proyecto como el compilador no podías t encuentra la clase. La respuesta de Sun/Oracle dice que este es el comportamiento esperado del compilador ya que el usuario no debería usar el paquete.

La pregunta es por qué las clases en el paquete se hicieron públicas en primer lugar?

Gracias,

Sarah

Respuesta

7

Las clases de sol en el JDK tienen prefijo sun. * Y no son parte de la interfaz pública, por lo que deben usarse con cuidado. Desde el Sun FAQ:

Las clases que incluye Sun con el Java 2 SDK, Standard Edition, caen en grupos de paquetes java, javax, org * y el sol .. Todos menos el sol.... Los paquetes son una parte estándar de la plataforma Java y serán compatibles con en el futuro. En general, los paquetes como sun., Que están fuera de la plataforma Java , pueden ser diferentes en las plataformas de sistema operativo (Solaris, Windows, Linux, Macintosh, etc.) y pueden cambiar en cualquier momento con SDK versiones (1.2, 1.2.1, 1.2.3, etc.). Programas que contienen llamadas directas al sol. paquetes no son 100% Pure Java. En otras palabras:

The java., Javax. y org. * paquetes documentados en la plataforma Java 2 Standard Especificación API Edición componen el funcionario, con el apoyo, interfaz pública.

Si un programa Java llama directamente sólo API en estos paquetes, funcionará en todas las plataformas compatibles con Java, independientemente de la plataforma subyacente OS .

Los paquetes sun. * No forman parte de la interfaz pública compatible con .

programa Java que llama directamente en el sol. * Paquetes no está garantizada para trabajar en todas las plataformas compatibles con Java.De hecho, un programa de este tipo se no garantiza que funcione incluso en futuras versiones en la misma plataforma.

2

Es porque modificadores de visibilidad Java (especialmente en el nivel de tipo, donde sólo hay dos opciones) actualmente no tienen la granularidad para lograr el tipo de visibilidad que estés haciendo alusión a. No conozco los detalles de la clase interna o las clases que estás usando, pero básicamente hacer que las clases sean privadas los hubiera hecho inadecuados para el propósito previsto, por lo que la única otra opción era pública.

1

Lamentablemente JAXB (incluido con java6) parece depender de un "com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper" clase no pública que le permite especificar los prefijos de espacio de nombres al cálculo de referencias a XML.

Tienes que ir realmente fuera de su camino para conseguir esta compilación con la hormiga: http://pragmaticintegration.blogspot.com/

Resumen:

Opción 1. Añadir libs jre como bootclasspathref Añadir propiedad: includeJavaRuntime = "sí"

Opción 2. uso JAXB RI-libs - propiedad cambio a "com.sun.xml.bind.marshaller.NamespacePrefixMapper"

también mencionado aquí: Define Spring JAXB namespaces without using NamespacePrefixMapper