Есть ли способ справиться с повторяющимися определениями элементов в нескольких файлах .xsd в JAXB?

У меня есть десятки и десятки файлов .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 .

Как мне настроить привязку для игнорирования повторяющихся конфигураций, сопоставления их с отдельными пакетами или сопоставления с существующими реализациями?

23
задан 2 February 2016 в 21:35
поделиться

3 ответа

Добавьте элемент <schemaBindings> в XSD:

<schemaBindings>
    <package name="com.whatever.stuff" />
</schemaBindings>

Источник

1
ответ дан 29 November 2019 в 03:06
поделиться

Я публикую свое решение для 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
}
0
ответ дан 29 November 2019 в 03:06
поделиться

У нас была похожая проблема: у нас был один файл 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>
0
ответ дан 29 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: