Как описано в посте « 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 informationExtensions: -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, являются их собственными. |