2010-05-19 6 views
7

Ist diese Aussage wahr:Verwenden Sie nicht com.sun.xml.internal. *?

com.sun.xml.internal Paket ist ein internes Paket wie der Name schon suggestes. Benutzer sollten keinen Code schreiben, der von internen JDK-Implementierungsklassen abhängt. Solche Klassen sind interne Implementierungsdetails des JDK und ohne

Ankündigung geändert werden

Einer meiner Kollegen verwendet eine der Klassen in seinem Code, der in Ant javac Aufgabe verursacht scheitern unser Projekt als Compiler couldn zu kompilieren‘ Ich finde die Klasse. Antwort von Sun/Oracle sagt, dass dies erwartetes Verhalten des Compilers ist, da der Benutzer das Paket nicht verwenden sollte.

Die Frage ist, warum die Klassen in dem Paket an erster Stelle veröffentlicht?

Danke,

Sarah

Antwort

7

Die Sun-Klassen im JDK sind mit dem Präfix sun. * Versehen und gehören nicht zur öffentlich unterstützten Schnittstelle. Sie sollten daher mit Vorsicht verwendet werden. Vom Sun FAQ:

Die Klassen, die Sonne mit dem SDK Java 2 enthält, Standard Edition, fallen in Paketgruppen java, javax, org * und Sonne .. Alle aber die Sonne.... Pakete sind ein Standard-Teil der Java-Plattform und wird unterstützt in die Zukunft. Im Allgemeinen können Pakete wie sun., Die außerhalb der Java-Plattform sind, über OS-Plattformen (Solaris, Windows, Linux, Macintosh, etc.) abweichen und können jederzeit ohne Ankündigung mit SDK um Zeit ändern Versionen (1.2, 1.2.1, 1.2.3, usw.). Programme , die direkte Anrufe an die Sonne enthalten. Pakete sind nicht 100% Pure Java. In anderen Worten:

Die Java., Javax. und org. * Pakete dokumentiert in der Java 2 Plattform Standard Edition API Spezifikation bilden die offizielle, unterstützte, öffentliche Schnittstelle.

Wenn ein Java-Programm direkt nur API in diesen Paketen ruft, wird es auf allen Java-fähigen Plattformen arbeiten, unabhängig von der zugrunde liegenden Betriebssystem Plattform.

Die sun. * Pakete sind nicht Teil der unterstützten, öffentlichen Schnittstelle.

Ein Java-Programm, das in Sonne direkt aufruft. * Pakete nicht garantiert auf allen Java-kompatiblen Plattformen zu arbeiten.In der Tat ist ein solches Programm nicht garantiert, auch in Zukunft Versionen auf der gleichen Plattform zu arbeiten.

2

Es ist, weil Java Sichtbarkeitsmodifizierer (vor allem auf der Typebene, wo es nur zwei Möglichkeiten) haben derzeit die Granularität, die Art von Sichtbarkeit Sie sind zu erreichen andeutend. Ich kenne die Einzelheiten der internen Klasse oder der Klassen, die Sie verwenden, nicht, aber die Klassen privat zu machen, hätte sie für ihren beabsichtigten Zweck ungeeignet gemacht, so dass die einzige andere Wahl öffentlich war.

1

Leider JAXB (mit Java6 gebündelt) scheint auf einem nicht öffentlichen Klasse „com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper“ verlassen, damit Sie Namespacepräfixe angeben, wenn auf xml Rangier.

Sie haben wirklich aus dem Weg zu gehen, um diese Compilieren mit Ameise zu bekommen: http://pragmaticintegration.blogspot.com/

Zusammenfassung:

Option 1. jre Libs als bootclasspathref hinzufügen Eigenschaft hinzufügen: includeJavaRuntime = "yes"

Option 2. Verwendung JAXB-RI-libs - Änderungseigenschaft auf "com.sun.xml.bind.marshaller.NamespacePrefixMapper"

Auch hier erwähnt: Define Spring JAXB namespaces without using NamespacePrefixMapper

Verwandte Themen