I've been using com.sun.xml.bind.marshaller.NamespacePrefixMapper
in my project, and i had no problem with it in JDK 6u17. Now I just updated to 6u18, and I saw that it has been replaced to com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper
. However if I import this class and try to compile my classes, I get the error:
package com.sun.xml.internal.bind.marshaller does not exist import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
I can access this package through the NetBeans code completion feature, and NetBeans does not highlight the code for errors.
Any help would be appreciated!
I don't think that the class
com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper
is a replacement ofcom.sun.xml.bind.marshaller.NamespacePrefixMapper
, the former is there for a long time and it NOT MEANT TO BE USED BY YOU AT ALL (hence theinternal
packaging).The problem here is that JavaSE 6 doesn't have the JAXB RI (it has a JAXB implemenation but not JAXB RI) so if you want to rely on RI specific feature, you should bundle JAXB RI in your application (and that would protect you from JAXB changes in Java SE).
You are not supposed to use
com.sun.**
classes directly. They are deemed to be internal and subject to change without notice. (And look what just happened!!) The fact that the new class hasinternal
in the package name is an even bigger hint!I strongly suggest that you look for a better way of doing what you are doing ... that doesn't use the
com.sun.**
classes.EDIT - hmmm, looks like whoever is responsible for the JAXB RI has broken the Sun rules about package names for that extension! And it is also unfortunate that Sun has not implemented this particular RI extension in JDK 6.0.
I ran into this recently when porting some older code into a new project. The old project compiled just fine using ant, however the new one failed with the error you mention above.
After some digging, I found that the old build.xml file uses a javac compiler option to bypass the restriction above:
After finding it, I searched and found this other stackoverflow question: Using internal sun classes with javac
The below post at stack overflow answers the question: Define Spring JAXB namespaces without using NamespacePrefixMapper
Key is to include the rt.jar at build time and remove it from the application after compilation.
The
NamespacePrefixMapper
is not usable anymore.Use the annotations in
package-info.java
:This works with the JAXB bundled with JDK7, for other JDK version update JAXB to 2.2.4.
For those using maven, found including both JAXB-RI and JAXB for java6 via this link worked.
http://mvnrepository.com/artifact/com.googlecode.jaxb-namespaceprefixmapper-interfaces/JAXBNamespacePrefixMapper/2.2.4