Проблема:
Имеется проект, собираемый 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-плагина уже при сборке.
Комментариев нет:
Отправить комментарий