ClassCastException при преобразовании DTMManagerDefault в DTMManager во время создания maven jaxb codegen

У меня странная проблема при попытке запустить сборку maven, которая использует плагин jaxb2 для генерации кода JAXB (см. Stacktrace ниже). Лучшее, что я могу понять, это то, что существует некоторая реализация DTMManager, класс загружается из другого JAR, чем тот, который находится в xalan-2.7.1; однако я убедился, что путь к классам, который используется для запуска цели jaxb: generate, имеет только один xalan-2. 7.1.jar, который содержит DTMManager или DTMManagerDefault - поэтому я понятия не имею, что еще может мешать.

И последнее: наша сборка определяет профиль «моментального снимка», который на самом деле служит только для JAR-архива. исходники (используя maven-source-plugin) и опубликуйте их как артефакты. Сценарий сбоя, описанный выше , только возникает, когда этот профиль указан в дополнение к профилю по умолчанию.

Я использую Maven 2.2.1, работающий на 64-разрядной версии Sun JDK 1.6.0_21 на Linux x64 ( Fedora 13) - информацию о 'mvn -v' см. Ниже в стеке.

Есть идеи относительно того, в чем может быть проблема и / или как ее отлаживать? Это причиняло мне боль последние несколько дней, а теперь блокирует прогресс: (

java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault cannot be cast to org.apache.xml.dtm.DTMManager
    at org.apache.xml.dtm.DTMManager.newInstance(DTMManager.java:137)
    at org.apache.xpath.XPathContext.<init>(XPathContext.java:102)
    at org.apache.xpath.jaxp.XPathImpl.eval(XPathImpl.java:207)
    at org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:281)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.buildTargetNodeMap(Internalizer.java:224)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.buildTargetNodeMap(Internalizer.java:289)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.transform(Internalizer.java:134)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.transform(Internalizer.java:96)
    at com.sun.tools.xjc.reader.internalizer.DOMForest.transform(DOMForest.java:448)
    at com.sun.tools.xjc.ModelLoader.buildDOMForest(ModelLoader.java:342)
    at com.sun.tools.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:374)
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:167)
    at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:113)
    at org.jvnet.jaxb2.maven2.XJC2Mojo.runXJC(XJC2Mojo.java:1119)
    at org.jvnet.jaxb2.maven2.XJC2Mojo.execute(XJC2Mojo.java:720)
...

mvn -v: class CVsApp: общедоступный CWinApp CWnd * CVsApp :: GetSheetView (LPCSTR WindowText) {CWnd * pWnd = ...

Инструмент статической проверки показывает нарушение в приведенном ниже коде:

class CSplitFrame : public CFrameWnd  
...
class CVsApp : public CWinApp
CWnd* CVsApp::GetSheetView(LPCSTR WindowText)
{
 CWnd* pWnd = reinterpret_cast<CSplitFrame*>(m_pMainWnd)->m_OutputBar.GetChildWnd(WindowText);
 return pWnd;
}

Сообщение об ошибке: Класс «CSplitFrame» наследуется от класса «CWnd»

Описание: Избегайте низвержения иерархии наследования. Это правило обнаруживает приведение от указателя базового класса к указателю подкласса.

Преимущества: Разрешение приведений вниз по иерархии наследования приводит к проблемам обслуживания, а приведение вниз от базового класса всегда незаконно.

Ссылки:

  1. ] Скотт Мейерс, «Эффективный C ++: 50 конкретных способов улучшить ваши программы и дизайн», второе издание, Addison-Wesley, (C) 2005 Pearson Education, Inc., глава: «Наследование и объектно-ориентированный дизайн», пункт 39
  2. JOINT STRIKE FIGHTER, ВОЗДУШНЫЙ ТРАНСПОРТ, СТАНДАРТЫ КОДИРОВАНИЯ C ++ Глава 4.23 Преобразование типов, Правило AV 178

Как вы думаете, это хорошая практика, чтобы не приводить указатель базового класса к указателю подкласса? Почему и когда мне следует следовать этому правилу?

5
задан Gunther Struyf 3 November 2017 в 08:51
поделиться