Что произошло с JAXB NamespacePrefixMapper в JDK6u18
Я использовал com.sun.xml.bind.marshaller.NamespacePrefixMapper
в своем проекте, и у меня не было проблем с ним в JDK 6u17. Теперь я просто обновился до 6u18, и увидел, что он был заменен на com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper
. Однако, если я импортирую этот класс и попытаюсь скомпилировать мои классы, я получаю сообщение об ошибке:
package com.sun.xml.internal.bind.marshaller does not exist
import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
Я могу получить доступ к этому пакету через функцию завершения кода NetBeans, а NetBeans не выделяет код для ошибок.
Любая помощь будет оценена!
Ответы
Ответ 1
Я не думаю, что класс com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper
является заменой com.sun.xml.bind.marshaller.NamespacePrefixMapper
, первый из них существует в течение длительного времени, и он НЕ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ВАМИ НА ВСЕХ (отсюда упаковка internal
).
Проблема здесь в том, что JavaSE 6 не имеет JAXB RI (у него есть реализация JAXB, но не JAXB RI), поэтому, если вы хотите полагаться на специфичную для RI функцию, вы должны связать JAXB RI в своем приложении (и что защитит вас от изменений JAXB в Java SE).
Ответ 2
NamespacePrefixMapper
больше не используется.
Используйте аннотации в package-info.java
:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri"
, xmlns = {
@XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package my.package.;
Это работает с JAXB в комплекте с JDK7, для другого обновления JDK версии JAXB до версии 2.2.4.
Ответ 3
Вы не должны использовать классы com.sun.**
напрямую. Они считаются внутренними и могут быть изменены без предварительного уведомления. (И посмотрите, что только что произошло!) Тот факт, что новый класс имеет internal
в названии пакета, является еще большим намеком!
Я настоятельно рекомендую вам искать лучший способ делать то, что вы делаете..., который не использует классы com.sun.**
.
EDIT - хммм, похоже, что тот, кто несет ответственность за JAXB RI, нарушил правила Sun о именах пакетов для этого расширения! К сожалению, Sun не реализовал это расширение RI в JDK 6.0.
Ответ 4
В этом случае Солнце сделало что-то не совсем подходящее. Преобразователь пространства имен не включен в спецификацию, но он "рекламируется" как способ настройки префиксов. Поэтому общий совет "не использовать com.sun.*
" здесь не применяется, а javadoc этого класса говорит:
Реализовано пользовательским приложением для определения отображения URI → префиксов.
Проверьте эту статью и посмотрите, будет ли это работать для вас.
Ответ 5
Я столкнулся с этим недавно, когда переносил старый код в новый проект. Старый проект скомпилирован с использованием ant, но новый с ошибкой вы упомянули выше.
После некоторого копания я обнаружил, что старый файл build.xml использует параметр компилятора javac для обхода ограничения выше:
<javac srcdir="${srcDir}" destdir="${outputDir}" classpathref="classpath" debug="on">
<compilerarg value="-XDignore.symbol.file" />
</javac>
После поиска, я искал и нашел этот другой вопрос stackoverflow:
Использование внутренних классов солнца с помощью javac
Ответ 6
Для тех, кто использует maven, найденные, включая JAXB-RI и JAXB для java6 через эту ссылку, работал.
http://mvnrepository.com/artifact/com.googlecode.jaxb-namespaceprefixmapper-interfaces/JAXBNamespacePrefixMapper/2.2.4
Ответ 7
Следующий пост при переполнении стека отвечает на вопрос:
Определить пространства имен Spring JAXB без использования NamespacePrefixMapper
Ключ должен включать rt.jar во время сборки и удалять его из приложения после компиляции.