Как вы вызываете schemagen в Java 11?

Согласно документации Oracle, инструмент schemagen удаляется из JDK как часть JEP 320 ( http://openjdk.java.net/jeps/320). Этот JEP указывает на артефакты Maven, которые теперь поставляют недостающие инструменты. Координаты артефактов неверны в JEP, обновленные координаты находятся в ответе на этот вопрос: какие артефакты я должен использовать для JAXB RI в моем проекте Maven?

Однако чего не хватает, так это как вызывать инструменты. В JEP есть сценарии оболочки, указанные в Git-репозитории JAXB-RI. Однако эти сценарии остаются недокументированными и их трудно вызвать. В инструкциях по сборке в этом git-репозитории указано, что он собран со стандартной "чистой установкой mvn", однако это не приводит к структуре вывода, которая соответствует папке "bin", используемой в документации здесь: https://javaee.github.io/jaxb-v2/doc/user-guide/ch04.html

В идеале я хотел бы запустить schemagen из Gradle, избегая сценариев оболочки, так как они не получены из зависимости maven.

Моя текущая попытка, адаптированная из рабочей версии, которая называется old schemagen.exe, выглядит следующим образом:

(В "реальном" файле build.gradle есть больше, чтобы указать зависимости моего приложения и т. Д.)

configurations {
  schemagenTool
}
dependencies {
  schemagenTool "org.glassfish.jaxb:jaxb-jxc:${jaxbVersion}"
}
task schemaGen(type: Exec, dependsOn: [compileJava,configurations.schemaGenTool]) {
  workingDir projectDir
  executable 'java'

  doFirst {
    file('build/Schemas').mkdirs()
    args '--module-path', "${configurations.schemaGenTool.asPath}",
         '-m', 'jaxb.jxc/com.sun.tools.jxc.SchemaGeneratorFacade',
         // Note: automatic module name is NOT com.sun.tool.jxc
         // as documented
         // Args to schemagen (these worked for the schemagen.exe)
         '-d', 'build/Schemas',
         '-classpath', "${compileJava.destinationDir}${File.pathSeparator}${configurations.compile.asPath}",
         "src/main/java/path/to/my/ModelClass.java"
         //println "\nschemagen: ${args.join(' ')}\n"
  }

  doLast {
    // Above creates "build/Schemas/schema1.xsd" (despite printing a different path!)
    // Rename it
    def destFile = file('build/Schemas/model.xsd')
    destFile.delete()
    if (!file('build/Schemas/schema1.xsd').renameTo(destFile)) {
      throw new GradleException("Failed to write new build/Schemas/model.xsd")
    }
  }
}

Однако это приводит к ошибке:

Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Modules jaxb.runtime and jaxb.core export package com.sun.xml.bind.marshaller to module relaxngDatatype

2 ответа

Решение

Проблема, кажется, известна с jaxb-*:2.3.0 версия - # jaxb-v2 / Issues / 1168. Кроме того, это будет решено в будущем выпуске, как отмечается в известных проблемах jaxb, работающих поверх java-9.

Вы можете решить это после комментария -

Пожалуйста, попробуйте 2.4.0-b180725.0644 - это модульный RI JPMS, работающий с JDK с модулем java.xml.bind (9,10) и без него (11-ea)

или попробуйте скачать бинарный дистрибутив по той же ссылке.

Сценарии оболочки Schemagen и xjc помещаются только в двоичный дистрибутив в каталог./bin.

Для инструментов сборки существуют плагины ( Maven / Gradle), которые вызывают API-интерфейсы schemagen и xjc, предоставляя пользователю простую настройку.

Ваша попытка вызвать com.sun.tools.jxc.SchemaGeneratorFacade вручную также правильно, вот аналогичный пример для Maven. Однако вы, вероятно, помещаете 2.3.0 в путь к модулю, который имеет проблему с разделенным пакетом. Установка на classpath решит проблему для 2.3.0. Следующий выпуск JAXB будет готов к JPMS и будет объявлен дескриптор модуля. Вы можете попробовать бета-сборку (2.4.0-b180725.0644), вот правильный набор зависимостей:

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId> <!--jaxb runtime-->
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-xjc</artifactId> <!--java generation-->
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-jxc</artifactId> <!--schema generation-->
</dependency>

Если вы пытаетесь использовать schemagen непосредственно при загрузке jaxb-ri обратите внимание на JAXB_PATH в schemagen.bat несовместимо с mod каталог в jaxb-ri.zip файл.

Например, чтобы использовать schemagen.bat:

  • На данный момент скачать jaxb-ri-2.3.1.zipиз https://maven.java.net/content/repositories/releases/com/sun/xml/bind/jaxb-ri/2.3.1/ (2.4.0-бета-версии также имелиmod/javax.activation-api.jar отсутствует)

  • Используйте эти шаги для запуска schemagen.bat, установив JAXB_HOME соответствующим образом:

         set JAXB_HOME=C:\Java\jaxb-ri-2.3.1
         set CLASSPATH=%JAXB_HOME%/mod/relaxng-datatype.jar;%JAXB_HOME%/mod/javax.activation-api.jar
         %JAXB_HOME%\bin\schemagen.bat -cp myjar1.jar;myjar2.jar -d target com.company.ClassName1 com.company.ClassName2
    

(Это было против JDK 11)

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