Вопрос

Сценарий следующий: у меня есть пакет 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 содержит целеусознание и другие необходимые атрибуты:

<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" >
.

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

<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 в verbose и debug mode, становится очевидным, что инструмент загружает все . Java файлы, кроме package-info.java , поэтому это ничего не знает о пространствах имен.

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

Спасибо заранее,

BUC

Это было полезно?

Решение

Fortunately I found the solution, I post it for those who run into the same problem in the future:

The reason it did not work is that I called the schemagen task in the wrong way (this can happen, if there is so little documentation or examples as in the case of schemagen). Instead of writing:

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

You should move the specific part of the path into the include element:

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

I'm still not sure why this is happening, but this way, the schemagen processor recognizes that the myapp/config directory in fact designates the java package myapp.config and by knowing that it is a package, it will also read the package info file.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top