Создание и использование веб-сервисов в одном проекте Maven - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь создать проект maven, пакет OSGi, который содержит веб-сервисы. Я использую JAX-WS со всеми аннотациями @WebService для указания веб-сервисов, которые у меня есть. Для загрузки этих веб-сервисов в расположении клиента вы обычно используете wsgen и wsimport для экспорта / импорта файлов WSDL. Я планирую использовать jaxws-maven-plugin для этого, но вот проблема:

Пакет может одновременно выполнять роль сервера и клиента. Он может зарегистрироваться в качестве клиента на родительском узле того же пакета (работающем на другой JVM / хосте). Таким образом, этот проект / пакет maven определяет интерфейс для веб-сервиса и определяет класс реализации, который реализует этот интерфейс. И интерфейс, и класс используют аннотацию @WebService как обычно.

@WebService
public interface Example {
    public void callMe();
}

@WebService
public class ExampleImpl implements Example {
    public void callMe() {};
}

А потом где-то в моем коде:

Endpoint p = Endpoint.publish(
                 "http://localhost:8080/example",
                 new ExampleImpl());    

jaxws: wsgen goal читает аннотации и создает выходные файлы (файлы .class, файлы .java, файлы WSDL, в зависимости от конфигурации ...). Но как мне использовать эти файлы во время выполнения jaxws: wsimport для того же запуска mvn package? В том же проекте Maven я хочу использовать этот веб-сервис, поэтому мне нужно написать что-то вроде этого:

ExampleImplService service = new ExampleImplService();
Example port = service.getExampleImplPort();
port.callMe();

Цель jaxws:gen выполняется в фазе process-classes, так как она должна читать скомпилированные классы, но jaxws:import должна выполняться в фазе generate-sources, чтобы подготовить все для компиляции. И теперь я сталкиваюсь с проблемой куриного яйца. Мне нужны скомпилированные классы для генерации выходных файлов через wsgen, но мне нужны выходные файлы wsgen для wsimport в фазе generate-sources maven. Моей первой попыткой было назначить цель jaxws:wsgen фазе generate-sources, но, конечно, она не работает, поскольку классы отсутствуют / еще не скомпилированы.

Какие есть варианты решения этой проблемы? Если мне нужно выполнить цель antrun для компиляции некоторых классов (а именно только классов с аннотациями @WebService) перед фазой generate-sources, чтобы jaxws:wsgen могла использовать ее (на этой фазе), создайте выходные файлы, которые затем используются jaxws:wsimport в фазе generate-sources? Есть ли другие способы решить эту проблему куриного яйца? Существуют ли другие "maven-способы" для компиляции серверной и клиентской части веб-сервисов в одном проекте maven? Это должно быть кстати. запускать из чистой mvn clean сборки, поэтому я не хочу / не люблю никаких решений, таких как «запустить mvn package дважды, чтобы сначала сгенерировать файлы веб-сервисов, а затем скомпилировать все остальное». Другими словами: mvn clean package должен скомпилировать весь проект maven / пакет osgi.

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Мне удалось решить эту проблему, переместив цель jaxsw:wsgen в фазу generate-sources.Я использую следующие шаги:

  1. Сначала я компилирую классы с аннотациями @WebService через выполнение antrun, которое использует <javac> для компиляции классов.Я сохраняю полученные файлы .class во временном каталоге, который удаляется после создания клиентских заглушек.
  2. Я создаю файл WSDL из скомпилированных файлов .class с целью jaxws:wsgen.
  3. Из временного каталога я создаю клиентские заглушки с обычной jaxws:wsimport целью.
  4. Я удаляю временный каталог со вторым antrun выполнением.

Полученный pomXML-файл выглядит следующим образом (только соответствующие части)

<properties>
    <tmpdirectory>${java.io.tmpdir}${file.separator}${user.name}-${project.groupId}-${project.artifactId}</tmpdirectory>
</properties>
...
        <plugin>
            <!-- clean tmp directory at every "mvn clean" -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <filesets>
                    <fileset>
                        <directory>${tmpdirectory}</directory>
                    </fileset>
                </filesets>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.6</version>
            <dependencies>
                  <dependency>
                      <groupId>com.sun</groupId>
                      <artifactId>tools</artifactId>
                      <version>1.6.0</version>
                      <scope>system</scope>
                      <systemPath>${java.home}/../lib/tools.jar</systemPath>
                  </dependency>
            </dependencies>  
            <executions>
                <execution>
                    <!-- compile webservice classes into tmp directory -->
                    <id>mini compile of webservices</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <property name="compile_classpath" refid="maven.compile.classpath"/>
                            <mkdir dir="${tmpdirectory}" />
                            <javac includeAntRuntime="false"
                                   classpath="${compile_classpath}"
                                   destdir="${tmpdirectory}">
                                <src path="${project.build.sourceDirectory}" />
                                <include name="org/example/project/*/webservice/*.java" />
                            </javac>
                        </target>
                    </configuration>
                </execution>
                <execution>
                    <!-- delete temporary directory (in case mvn clean is not called) -->
                    <id>clean up tmp dir</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <delete dir="${tmpdirectory}" />
                        </target>
                    </configuration>
                </execution>
            </executions>  
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>1.10</version>
            <executions>
                <execution>
                    <!-- generate WSDL file from the compiled classes in tmp directory -->
                    <id>generate wsdl file</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                    <configuration>
                        <sei><!-- service endpoint implementation  --></sei>
                        <destDir>${tmpdirectory}</destDir>
                        <genWsdl>true</genWsdl>
                        <resourceDestDir>${tmpdirectory}</resourceDestDir>
                    </configuration>
                </execution>
                <execution>
                    <!-- create client stub files -->
                    <id>create client files from wsdl file</id>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <keep>true</keep>
                        <wsdlDirectory>${tmpdirectory}</wsdlDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
0 голосов
/ 15 февраля 2011

где вы определяете свой плагин, вам нужно будет настроить два отдельных исполнения, одно для wsgen, а другое для wsimport.

... проходит время ...

Использовать Mavenчтобы запустить wsgen & wsimport в строке, используя wsdlLocation

...