#cxf #wsdl2java #java-12
#cxf #wsdl2java #java-12
Вопрос:
Раньше следующая команда работала безупречно:
C:toolsapache-cxf-3.3.1binwsdl2java -client -d generated foo.wsdl
Он больше не работает с последней версией JDK — 12. Я загрузил последнюю версию Apache CXF и все еще получаю ту же ошибку:
-Djava.endorsed.dirs=C:toolsapache-cxf-3.3.1bin..libendorsed is not supported. Endorsed standards and standalone APIs
in modular form will be supported via the concept of upgradeable modules.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Кто-нибудь может дать совет о том, как это исправить?
Комментарии:
1. Одобренный стандартный механизм переопределения был признан устаревшим в обновлении Java SE 8 и удален в Java SE 9. Я ничего не знаю об Apache XCF, но есть ли у них версия, которая работает на JDK 9 и новее?
2. @AlanBateman согласно их часто задаваемым вопросам, он поддерживает Java 9 cxf.apache.org/faq.html#FAQ-CanCXFrunwithJDK/Java9 (10,11) ?
3. Я ничего не знаю о Apache CXF, но на этой веб-странице написано «CXF будет поддерживать Java 9-11 со следующей версией 3.3.x». Путь к файлу в вашем вопросе предполагает, что вы используете 3.1.6. В любом случае, одобренный механизм переопределения стандартов был удален с JDK 9.
4. @AlanBateman Прошу прощения, но 3.1.6 — это опечатка. Я использовал 3.3.1. Я только что исправил это.
5. @AlanBateman Я не эксперт в CXF. wsdl2java — единственная вещь CXF, которую я использую время от времени. Вот почему я задаю этот вопрос здесь. Я действительно ценю ваши попытки помочь.
Ответ №1:
Я получил утилиту Apache CXF 3.3.1 wsdl2java для работы с последней версией OpenJDK 11, выполнив 4 действия:
- Извлеките этот jar и поместите его в каталог {CXF_HOME}/lib:https://mvnrepository.com/artifact/javax.jws/jsr181-api/1.0-MR1
- Извлеките этот jar и также поместите его в каталог {CXF_HOME}/lib:https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api/2.3.1
-
В моем случае, поскольку я работаю на Mac, я запустил скрипт wsdl2java и убедился, что эти два jar-файла явно заданы в пути к классу CXF, выполнив следующее объявление в скрипте прямо перед выполнением команды Java:
cxf_classpath=${cxf_classpath}:../lib/jaxws-api-2.3.1.jar:../lib/jsr181-api-1.0-MR1.jar
-
Наконец, я удалил параметр ‘-Djava.approved.dirs=»${cxf_home}/lib /approved»‘ из команды java в конце сценария, поскольку новые JDK больше не поддерживают этот аргумент, поэтому моя команда теперь выглядит так:
$JAVA_HOME/bin/java -Xmx${JAVA_MAX_MEM} -cp "${cxf_classpath}" -Djava.util.logging.config.file=$log_config org.apache.cxf.tools.wsdlto.WSDLToJava "$@"
Теперь, используя OpenJDK11, я могу указать на внешний файл WSDL и успешно сгенерировать клиентский код, необходимый для использования этой службы SOAP, с помощью следующей команды:
./wsdl2java -client -d src https://somewhere.com/service?wsdl
Независимо от того, работает ли все это, пока неясно, с точки зрения возможности вызывать и использовать службу SOAP, для которой я кодирую, но я, по крайней мере, теперь преодолел проблему с поддержкой Java9 с помощью этого инструмента, специфичного для генерации клиентского кода из WSDL.
Если ваши потребности отличаются, я бы, по крайней мере, удалил параметр JVM ‘-Djava.approved.dirs=»${cxf_home}/lib /approved»‘ и начал вызывать команду wsd2java с параметрами, которые вам нужно установить, и просто начал итеративно добавлять обратно в отсутствующие библиотеки, которые запускают java.lang.Ошибки NoClassDefFoundError для.
В их часто задаваемых вопросах конкретно говорится, что начиная с версии 3.3.x будет поддерживаться Java 9 , но что-то явно сбило мяч между больше не поддерживаемыми жестко закодированными аргументами JVM, которые все еще передаются в утилите, и отсутствующими библиотеками для поддержки более новых JDK, где эти устаревшие библиотеки были удалены.
Надеюсь, это поможет кому-то, кому не повезло, что он все еще программирует на конечных точках SOAP, но пытается, по крайней мере, поддерживать код на стороне клиента, который вы пишете, в актуальном состоянии и использовать новые возможности современного JDK.
Комментарии:
1. Спасибо за ответ. Я использую Windows. Мне намного проще использовать Java 8 для решения этой проблемы. Я не проверял ваш ответ, который также может работать на компьютере с Windows, но я принял ваш ответ.
2. Я не могу поверить, что нашел ответ на это.
3. Конечно, это приведет к выполнению генерации кода, но ваш сгенерированный код не будет компилироваться с Java 11 , потому что такие пакеты, как javax.xml.bind.annotation, были удалены.