Хорошо, я проверил ваши схемы.
Ваша исходная проблема связана с неправильным импортом. Например, схема TCIP*.xsd
0_0_Final.xsd
имеет следующие импорты:
<xs:import namespace="http://www.im-partial-03-00-38" schemaLocation="im_Partial_03_00_38.xsd"/>
<xs:import namespace="http://www.itis-final-3-0-0" schemaLocation="itis_FinalIM_Partial_03_00_38.xsd
ITIS_Final_3_0_0.xsd
LRMS_Final_09_07.xsd
TCIP*.xsd
0_0_Local.xsd
0_0.xsd"/>
<xs:import namespace="http://www.lrms-final-09-07" schemaLocation="lrms_Final_09_07.xsd"/>
<xs:import namespace="http://www.tcip-4-0-0-local" schemaLocation="tcip*.xsd
0_0_local.xsd"/>
Принимая во внимание, что файлы названы в другом регистре:
IM_Partial_03_00_38.xsd
ITIS_Final_3_0_0.xsd
LRMS_Final_09_07.xsd
TCIP*.xsd
0_0_Local.xsd
На самом деле это неверно, поскольку URL-адреса фактически чувствительны к регистру. Поэтому я бы сказал, что структура импорта этих схем недействительна.
Когда вы компилируете схемы, XJC создает и поддерживает URL-адрес хэш-карты -> документ схемы, который он использует, чтобы избежать повторной загрузки одной и той же схемы. URL-адреса (или, в частности, "системные идентификаторы") обрабатываются с учетом регистра.
Если компилировать все схемы (*.xsd
), то некоторые схемы включаются в компилируемый набор (как минимум) дважды: первый раз напрямую, а второй раз через прямой или косвенный импорт. Таким образом, вы получаете IM_Partial_03_00_38.xsd
два раза. А поскольку XJC использует системные идентификаторы с учетом регистра для кэша схемы, он думает, что это два разных документа, пытается дважды скомпилировать один и тот же файл — что приводит к коллизиям. (Ошибки, которые вы получаете.)
Если вы просто скомпилируете TCIP_4_0_0_Final.xsd
, то доступ к каждой схеме будет только один раз. Операционная система радостно игнорирует регистр при доступе к файлам и все работает.
Я экспериментировал с вашими схемами в следующем демонстрационный проект. (Схемы ZIP загружаются во время сборки, поэтому с юридической точки зрения это не проблематично). Мне пришлось добавить файл привязки, но он заработал довольно быстро. Это работает на моей машине (Windows), но я думаю, что это может не работать на * nix. Хотя не уверен.
Затем я подумал, что могу использовать файл каталога, чтобы исправить проблему регистра в URL-адресах схемы.
К моему сожалению, это не сработало легко.
Во-первых, я обнаружил, что нецелесообразно переписывать системные идентификаторы при компиляции локальных файлов. URL-адреса, подлежащие перезаписи, задаются как полные абсолютные file://.../schema.xsd
URL-адреса, поэтому включение таких правил перезаписи в файл каталога сделает файл каталога специфичным для каталога/машины, что нецелесообразно. На самом деле это проблема преобразователя каталога XJC, но я постараюсь решить ее.
Затем я подумал, что если URL-адреса локальных файлов не работают, то подойдут абсолютные URL-адреса. Давайте представим, что мы хотим скомпилировать схемы из ZIP-файла из исходного URL:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaIncludes/>
<catalog>src/main/resources/catalog.cat</catalog>
<schemas>
<schema>
<url>http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd</url>
</schema>
</schemas>
</configuration>
</execution>
</executions>
</plugin>
URL http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd
не работает, конечно. (Помните, мы просто притворяемся.) Но он дает абсолютный URL, который не зависит от конкретной машины.
Чтобы разрешить XJC разрешать схемы из этого URL-адреса, нам понадобится файл каталога. Если мы сделали локальные копии схем в src/main/resources
, то файл каталога src/main/resource/catalog.cat
должен разрешить схемы от http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set
до src/main/resources
:
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"
Я подумал, тогда мы могли бы переписать недопустимые URL-адреса в нижнем регистре, и все были бы довольны.
Это сработало, но только для абсолютного URL http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd
. XJC пытался разрешить относительный импорт как относительные URL-адреса, такие как lrms_Final_09_07.xsd
, а не (как я ожидал) как абсолютные URL-адреса, такие как http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/lrms_Final_09_07.xsd
.
На секунду, когда я компилировал локальные файлы, они были сначала разрешены как абсолютные URL-адреса. И когда я попытался скомпилировать схему с помощью абсолютных URL-адресов, относительный импорт был разрешен как относительный URL-адреса.
Тем не менее в итоге я пришел к следующему файлу каталога:
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"
REWRITE_SYSTEM "tmdd_Partial_0_0_0.xsd" "TMDD_Partial_0_0_0.xsd"
REWRITE_SYSTEM "lrms_Final_09_07.xsd" "LRMS_Final_09_07.xsd"
REWRITE_SYSTEM "atis_Partial_03_00_74.xsd" "ATIS_Partial_03_00_74.xsd"
REWRITE_SYSTEM "im_Partial_03_00_38.xsd" "IM_Partial_03_00_38.xsd"
REWRITE_SYSTEM "itis_Final_3_0_0.xsd" "ITIS_Final_3_0_0.xsd"
REWRITE_SYSTEM "tcip_4_0_0_local.xsd" "TCIP_4_0_0_Local.xsd"
REWRITE_SYSTEM "TCIP_4_0_0_Final.xsd" "TCIP_4_0_0_Final.xsd"
REWRITE_SYSTEM "atis_Partial_03_00_74.xsd" "atis_Partial_03_00_74.xsd"
REWRITE_SYSTEM "ITIS_Final_3_0_0_for_atis.xsd" "ITIS_Final_3_0_0_for_atis.xsd"
REWRITE_SYSTEM "ITIS_Local_for_atis.xsd" "ITIS_Local_for_atis.xsd"
REWRITE_SYSTEM "LRMS_Final_09_07_for_atis.xsd" "LRMS_Final_09_07_for_atis.xsd"
REWRITE_SYSTEM "LRMS_Local_for_atis.xsd" "LRMS_Local_for_atis.xsd"
REWRITE_SYSTEM "ATIS_03_00_74_Local.xsd" "ATIS_03_00_74_Local.xsd"
REWRITE_SYSTEM "TMDD_Partial_0_0_0.xsd" "TMDD_Partial_0_0_0.xsd"
REWRITE_SYSTEM "ITIS_Local_for_im.xsd" "ITIS_Local_for_im.xsd"
REWRITE_SYSTEM "LRMS_Final_09_07_for_im.xsd" "LRMS_Final_09_07_for_im.xsd"
REWRITE_SYSTEM "LRMS_Local_for_im.xsd" "LRMS_Local_for_im.xsd"
REWRITE_SYSTEM "IM_03_00_38_Local.xsd" "IM_03_00_38_Local.xsd"
REWRITE_SYSTEM "ITIS_3_0_0_Local.xsd" "ITIS_3_0_0_Local.xsd"
REWRITE_SYSTEM "LRMS_09_07_Local.xsd" "LRMS_09_07_Local.xsd"
Переписывание имен файлов из нижнего регистра в верхний было именно тем, что я хотел сделать. Но почему я должен был переписать все остальные имена файлов в идентичные имена файлов, выше моего понимания.
Тем не менее файл каталога выше раза в 3 больше, чем должен был быть, но работает. Вот еще один демонстрационный проект который теперь тоже строит без ошибок.
К сожалению, я должен сказать, что каталоги до сих пор не работают удовлетворительно. Я подал следующие вопросы в maven-jaxb2-плагин:
Чтобы было ясно, с моей точки зрения, ни одна из этих проблем не является ошибкой в моем maven-jaxb2-plugin
. Это то, что я «унаследовал» от XJC и используемого там преобразователя каталогов.
Но я постараюсь решить это в своем плагине.
person
lexicore
schedule
15.11.2014