barbitoff programmer`s blog

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

четверг, 10 января 2013 г.

maven и jaxws-maven-plugin 2.2: проблема со сборкой на JDK 1.6.

Проблема:

Имеется проект, собираемый maven`ом с использованием jaxws-maven-plugin версии 2.2. Проект без проблем собирается с использованием JDK 1.7, однако при попытке собрать его на JDK 1.6 возникает ошибка:
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project Fileadapter-ECM-WS: Compilation failure: Compilation failure:
symbol  : constructor Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
location: class javax.xml.ws.Service
Добавление в проект зависимости от jaxws-api 2.2:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.2.8</version>
<scope>compile</scope>  
</dependency>

не помогает, т.к. при компиляции используется jaxws-api из JDK, а там, в случае JDK 1.6, находится версия jaxws-api 2.1.

Решение:

Уже когда-то писал про аналогичную проблему (http://barbitoff.blogspot.ru/2012/01/cannot-find-symbol-symbol-constructor.html), правда тогда собирал ant`ом, а не maven`ом. 
Решения, вобщем-то, два. Первое - перейти на jaxws-maven-plugin версии 2.1. Второе - использовать endorsed-механизм, чтобы заменить версию jaxws-api при сборке (если мы знаем, что в целевой среде, где будет выполняться приложение, будет jaxws-api версии 2.2 и реализующая его имплементация). Делается это следующим образом:
1) Во-первых, в проекте необходимо создать папку для endorsed-библиотек. Я создал её в корне проекта (на одном уровне с pom.xml) и называл "endorsed".
2) В созданную папку поместить jar-ник jaxws-api версии 2.2, скачать его можно тут.
3) Настроить maven-compiler-plugin на использование нашей endorsed-папки:
<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArguments>
            <endorseddirs>${basedir}/endorsed</endorseddirs>
          </compilerArguments>
        </configuration>
      </plugin>
      <!-- ... -->
</build>
PS Конечно, правильнее с точки зрения философии maven будет не класть заранее jar-ник в папку endorsed, а размещать эту папку в директории сборки и копировать туда jar-ник как зависимость с помощью dependency-плагина уже при сборке.

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

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