Задача муравья schemagen игнорирует package-info.java

Сценарий следующий: у меня есть пакет java (myapp.config), который содержит все мои JAXB-аннотированные классы, из которых я хотел бы сгенерировать файл схемы XML. В пакете также есть файл package-info.java, который содержит аннотацию @XmlSchema для элемента пакета, которая действительна для всего пакета:

@XmlSchema(namespace="http://myapp/config",
           xmlns = @XmlNs(prefix="myapp", namespaceURI="http://myapp/config"),
           elementFormDefault=XmlNsForm.QUALIFIED)
package myapp.config;

Когда я запускаю инструмент командной строки schemagen, который поставляется с JDK,

D:\Projects\Myapp>"%JAVA_HOME%/bin/schemagen" -cp "%JAVA_HOME%/lib/tools.jar"
src/myapp/config/*.java

Я получаю правильный результат: корневой элемент в сгенерированном файле schema1.xsd содержит targetNamespace и другие необходимые атрибуты:

<xs:schema elementFormDefault="qualified" version="1.0"
           targetNamespace="http://myapp/config"
           xmlns:tns="http://myapp/config"
           xmlns:myapp="http://myapp/config">
           xmlns:xs="http://www.w3.org/2001/XMLSchema" >

Однако, когда я хочу выполнить ту же задачу в моем скрипте Ant,

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>

Кажется, что инструмент schemagen полностью игнорирует аннотации пространства имен, потому что в результирующем файле schema1.xsd их нет и следа:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

Когда я запускаю задачу schemagen в подробном режиме и режиме отладки, становится очевидно, что инструмент загружает все файлы .java, кроме package-info.java, поэтому он ничего не знает о пространствах имен.

Вы встречали это странное поведение раньше? Почему инструмент командной строки обрабатывает файл информации о пакете, а задача Ant - нет? Что я должен сделать, чтобы заставить задачу Ant работать?

Заранее спасибо,
BUC

1 ответ

Решение

К счастью, я нашел решение, я выкладываю его для тех, кто столкнется с той же проблемой в будущем:

Причина, по которой это не сработало, заключается в том, что я неправильно назвал задачу schemagen (это может произойти, если документации и примеров так мало, как в случае schemagen). Вместо того чтобы писать:

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>

Вы должны переместить определенную часть пути в элемент include:

<schemagen srcdir="src" destdir="dist">
    <include name="myapp/config/*.java"/>
</schemagen>

Я до сих пор не уверен, почему это происходит, но таким образом процессор schemagen распознает, что каталог myapp / config фактически определяет пакет java myapp.config, и, зная, что это пакет, он также будет читать информацию о пакете. файл.

Другие вопросы по тегам