barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 11 января 2013 г.

jaxws-maven-plugin 2.1 и "unmappable character for encoding UTF-8"

Проблема:

В проекте используется jaxws-maven-plugin версии 2.1, генерирующий классы по WSDL. В WSDL и импортируемой в неё схеме есть русские буквы в аннотациях. При сборке проекта при компиляции возникают ошибки "unmappable character for encoding UTF-8" при попытке скомпилировать сгенерированные классы. ОС - Windows, кодировка исходников проекта - UTF-8.

Причина:

Проект использует кодировку исходников UTF-8. wsimport генерирует исходники в cp1251 (в системной кодировке), причем они содержат русские символы в комментариях, пришедшие туда из аннотаций к XSD-схеме.
В отличие от wsimport`а версии 2.2, опции "encoding", позволяющей задать кодировку целевых файлов, нет. Нет такой опции и у используемого им xjc (эту опцию можно было бы передать ему через опцию -B<xjcoption> wsimport`а).

Решение:

Как ни странно, помогла установка параметра xnocompile в false:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<!-- ... -->
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>false</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
</configuration>
</plugin>
Также xnocompile можно установить в false не в конфигурации всего плагина, а внутри конфигурации execution`а, эффект тот же:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
 <execution>
<goals>
 <goal>wsimport</goal>
</goals>
<configuration>
 <xnocompile>false</xnocompile>
 <!-- ... -->
</configuration>
<!-- ... -->
 </execution>
</executions>
<!-- ... -->
</plugin>
Генерируемые исходники все также в cp1251, но компиляция проходит. Есть идея, что это происходит потому, что сгенерированные файлы компилируются сразу wsimport`ом, и в этом случае компилятор не обращает внимание на кодировку файлов проекта (посколько о ней не знает), а читает исходники в системной кодировке, в какой они и действительно закодированы.

Комментариев нет:

Отправить комментарий