У меня есть десятки и десятки файлов .xsd
, для которых я хочу автоматически сгенерировать код. У пары файлов одинаковые имена, которые конфликтуют, когда я пытаюсь сгенерировать их все одновременно.
Я просто пытаюсь заставить работать 2 из них.
Когда у меня заработают эти 2, я исправлю остальные. Но пока я сосредоточусь только на двух из этих файлов. Я не контролирую их, они от поставщика и следуют «стандарту» , поэтому их редактирование не вариант по нескольким причинам.
Я использую maven-jaxb2-plugin
для обработки этих файлов.
Я добавил файл binding.xjb
, как предложено в ссылке в ответе mat b
и другие инструкции я нашел в сети. Но я получаю следующие ошибки, нет вывода.
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.1"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation=" http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">
<jxb:bindings schemaLocation="mac-3.4.xsd">
<jxb:schemaBindings>
<jxb:package name="my.company.mac"/>
</jxb:schemaBindings>
</jxb:bindings>
<jxb:bindings schemaLocation="mac-stylesheet-3.4.xsd">
<jxb:schemaBindings>
<jxb:package name="my.company.stylesheet"/>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
дает следующую ошибку
[ERROR] Error while parsing schema(s).Location [ file:/C:/Users/Jarrod%20Roberson/Projects/spa-tools/spa-lib/src/main/sc
hema/mac-stylesheet-3.4.xsd{165,33}].
org.xml.sax.SAXParseException: 'halign' is already defined
Неверный элемент: (есть много других, это только первый конфликт)
<xsd:simpleType name="halign">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="left" />
<xsd:enumeration value="center" />
<xsd:enumeration value="right" />
</xsd:restriction>
</xsd:simpleType>
И идентичен в каждом из файлы .xsd
, как мне разрешить это дублирование, если создается только один класс или каждый из них создается в собственном пространстве имен пакетов?
Это не единственный повторяющийся элемент, подобный этому их много, поэтому просто попытаться удалить их из файлов тоже не вариант.
Этот halign
находится в нескольких .xsd
файлах, и я хочу либо поставить их в своих индивидуальных пакетах, или иметь возможность указать компилятору использовать первый из созданных пакетов.
Это то место, где я начал, прежде чем попытался использовать внешний файл .xjb
, просто указав пакет
в pom.xml
.
Как мне настроить привязку для игнорирования повторяющихся конфигураций, сопоставления их с отдельными пакетами или сопоставления с существующими реализациями?
Добавьте элемент <schemaBindings>
в XSD:
<schemaBindings>
<package name="com.whatever.stuff" />
</schemaBindings>
Я публикую свое решение для gradle , оно решает проблему дубликатов и не требует xjb-файлов:
task generateJaxb() {
ext.sourcesDir = "${buildDir}/generated-sources/jaxb"
ext.classesDir = "${buildDir}/classes/jaxb"
ext.schemaDir = "src/resources/schemas"
ext.tmp = "${buildDir}/tmp/xjc"
doLast() {
project.ant {
taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
classpath: configurations.jaxb.asPath
delete(dir: tmp)
mkdir(dir: tmp)
delete(dir: sourcesDir)
delete(dir: classesDir)
mkdir(dir: sourcesDir)
mkdir(dir: classesDir)
}
fileTree(schemaDir){
include '**/*.xsd'
include '**/*.wsdl'
}.each{File file->
//println file
project.ant {
taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
classpath: configurations.jaxb.asPath
xjc(destdir: tmp, schema:"${file.getAbsolutePath()}") {
arg(value: "-wsdl")
produces(dir: tmp, includes: "**/*.java")
}
copy(todir: sourcesDir) {
fileset(dir: tmp, erroronmissingdir: false) {
include(name: "**/*.java")
}
}
delete(dir: tmp)
mkdir(dir: tmp)
}
}
project.ant {
javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true,
debugLevel: "lines,vars,source",
classpath: configurations.jaxb.asPath) {
src(path: sourcesDir)
include(name: "**/*.java")
include(name: "*.java")
}
copy(todir: classesDir) {
fileset(dir: sourcesDir, erroronmissingdir: false) {
exclude(name: "**/*.java")
}
}
}
}
}
configurations {
jaxb
}
dependencies {
jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1")
compile(files(generateJaxb.classesDir).builtBy(generateJaxb))
}
jar {
from generateJaxb.classesDir
}
У нас была похожая проблема: у нас был один файл wsdl и два файла xsd в одном каталоге. Файл wsdl импортирует два файла xsd. Проблема заключалась в том, что JAXB учитывал все три файла и выдавал ошибку «... уже определено». В основном он жаловался на то, что он видел один и тот же элемент в файле wsdl и xsd.
Мы могли бы исправить эту проблему в конфигурации плагина maven (в pom.xml) , добавив тег exclude , как в следующем примере:
<build>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.12.3</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaLanguage>WSDL</schemaLanguage>
<generatePackage>mywsdl.wsdl</generatePackage>
<args><arg>-XautoNameResolution</arg></args>
<schemas>
<schema>
<fileset>
<excludes>
<exclude>*.xsd</exclude>
</excludes>
</fileset>
</schema>
</schemas>
</configuration>
</plugin>
</plugins>
</build>