Статьи

Запуск компилятора JAXB xjc с OpenJDK 11

Как описано в посте « API-интерфейсы, подлежащие удалению из Java 11 », реализация JAXB больше не включена в JDK 11 . В этой статье я расскажу об использовании компилятора xjc, предоставляемого с эталонной реализацией JAXB ( Java Architecture для XML Binding ) в сочетании с OpenJDK 11, для компиляции файлов схемы XML в классы Java.

До Java SE 6 разработчикам, желающим использовать JAXB с приложением Java SE, необходимо было приобретать реализацию JAXB отдельно, поскольку она не была предоставлена ​​в дистрибутиве Java. Реализация JAXB была включена в Java, начиная с Java SE 6 . Во многих случаях это было удобно, но усложняло ситуацию, когда разработчики хотели использовать более новую версию или другую реализацию JAXB, чем та, которая поставляется с JDK. Когда в OpenJDK 9 была введена модульность, реализация JAXB была перемещена в модуль java.xml.bind и помечена как устаревшая для удаления . Реализация JAXB была удалена вместе с JDK 11 . Этот пост посвящен использованию компилятора JAXB xjc с OpenJDK 11 .

Поскольку JDK 11 больше не включает реализацию JAXB, его необходимо приобретать отдельно. В этом посте я буду использовать версию 2.3.0 эталонной реализации JAXB . Версия JDK, используемая в этом посте, — JDK 11.0.2, общедоступная версия .

Запуск сценариев xjc без аргументов приводит к тому, что справка / использование выводятся на стандартный вывод.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Usage: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
If dir is specified, all schema files in it will be compiled.
If jar is specified, /META-INF/sun-jaxb.episode binding file will be compiled.
Options:
  -nv                :  do not perform strict validation of the input schema(s)
  -extension         :  allow vendor extensions - do not strictly follow the
                        Compatibility Rules and App E.2 from the JAXB Spec
  -b <file/dir>      :  specify external bindings files (each <file> must have its own -b)
                        If a directory is given, **/*.xjb is searched
  -d <dir>           :  generated files will go into this directory
  -p <pkg>           :  specifies the target package
  -m <name>          :  generate module-info.java with given Java module name
  -httpproxy <proxy> :  set HTTP/HTTPS proxy. Format is [user[:password]@]proxyHost:proxyPort
  -httpproxyfile <f> :  Works like -httpproxy but takes the argument in a file to protect password
  -classpath <arg>   :  specify where to find user class files
  -catalog <file>    :  specify catalog files to resolve external entity references
                        support TR9401, XCatalog, and OASIS XML Catalog format.
  -readOnly          :  generated files will be in read-only mode
  -npa               :  suppress generation of package level annotations (**/package-info.java)
  -no-header         :  suppress generation of a file header with timestamp
  -target (2.0|2.1)  :  behave like XJC 2.0 or 2.1 and generate code that doesnt use any 2.2 features.
  -encoding <encoding> :  specify character encoding for generated source files
  -enableIntrospection :  enable correct generation of Boolean getters/setters to enable Bean Introspection apis
  -disableXmlSecurity  :  disables XML security features when parsing XML documents
  -contentForWildcard  :  generates content property for types with multiple xs:any derived elements
  -xmlschema         :  treat input as W3C XML Schema (default)
  -dtd               :  treat input as XML DTD (experimental,unsupported)
  -wsdl              :  treat input as WSDL and compile schemas inside it (experimental,unsupported)
  -verbose           :  be extra verbose
  -quiet             :  suppress compiler output
  -help              :  display this help message
  -version           :  display version information
  -fullversion       :  display full version information
 
 
Extensions:
  -Xinject-code      :  inject specified Java code fragments into the generated code
  -Xlocator          :  enable source location support for generated code
  -Xsync-methods     :  generate accessor methods with the 'synchronized' keyword
  -mark-generated    :  mark the generated code as @javax.annotation.Generated
  -episode <FILE>    :  generate the episode file for separate compilation
  -Xpropertyaccessors :  Use XmlAccessType PROPERTY instead of FIELD for generated classes

xjc компилятора xjc (bash-файл и пакетный файл DOS) удобны для вызова jaxb-xjc.jar . Скрипты вызывают его как исполняемый JAR ( java -jar ), как показано в следующих выдержках:

  • Версия для Windows ( xjc.bat ):
    %JAVA% %XJC_OPTS% -jar "%JAXB_HOME%\lib\jaxb-xjc.jar" %*
  • Версия для Linux ( xjc.sh ):
    exec "$JAVA" $XJC_OPTS -jar "$JAXB_HOME/lib/jaxb-xjc.jar" "$@"

Как показывают приведенные выше выдержки из сценария, переменная окружения XJC_OPTS включена в вызов средства запуска Java. К сожалению, JAR-эталонную реализацию JAXB нельзя просто добавить в -classpath к классам через -classpath потому что выполнение исполняемых JAR-файлов с помощью java -jar только java -jar к классам, указанный в исполняемом JAR-файле через Class-Path MANIFEST.MF (эта запись существует в jaxb-ri-2.3.0.jar как « Class-Path: jaxb-core.jar jaxb-impl.jar »).

Один из подходов к этому — модифицировать сценарий, чтобы использовать JAR в качестве обычного JAR (без -jar ) и явно выполнять класс XJCFacade , чтобы путь к классам мог быть явно указан для средства запуска Java . Это продемонстрировано для сценария Windows xjc.bat :

%JAVA% -cp C:\lib\javax.activation-api-1.2.0.jar;C:\jaxb-ri-2.3.0\lib\jaxb-xjc.jar com.sun.tools.xjc.XJCFacade %*

В дополнение к эталонной реализации JAXB JAR javax.activation-api-1.2.0.jar мне также нужно было включить JAR javax.activation-api-1.2.0.jar к классам, поскольку JavaBeans Application Framework ( JAF ) является зависимость, которая также больше не поставляется с JDK (удалена через тот же JEP 320, который удалил JAXB).

Также возможно, конечно, вообще не использовать сценарии XJC и запускать средство запуска Java напрямую. Сценарий гарантирует, что переменная окружения JAXB_HOME установлена. Эта переменная среды должна указывать на каталог, в который была расширена эталонная реализация JAXB.

С этими изменениями компилятор JAXB xjc может быть выполнен для XSD в командной строке с использованием JDK 11.

Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Запуск JAXB xjc Compiler с OpenJDK 11

Мнения, высказанные участниками Java Code Geeks, являются их собственными.