2011-02-11 4 views
2

웹 서비스가 포함 된 OSGi 번들 인 maven 프로젝트를 빌드하려고합니다. 모든 @WebService 주석이있는 JAX-WS를 사용하여 내가 가지고있는 웹 서비스를 지정합니다. 클라이언트 위치에서 이러한 웹 서비스를로드하려면 일반적으로 WSDL 파일을 내보내거나 가져 오는 데 wsgenwsimport을 사용합니다. jaxws-maven-plugin을 사용하려고하지만 여기에 문제가 있습니다.동일한 메이븐 프로젝트에서 웹 서비스 생성 및 사용

번들은 동시에 서버와 클라이언트로 작동 할 수 있습니다. 동일한 번들 (다른 JVM/호스트에서 실행 중)의 상위 노드에 클라이언트로 등록 될 수 있습니다. 따라서이 프로젝트/번들은 웹 서비스를위한 인터페이스를 정의하고이 인터페이스를 구현하는 구현 클래스를 정의합니다. 인터페이스와 클래스 모두 보통 때와 마찬가지로 @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 파일을 만들 ...). 그러나 목표에서 동일한 파일 mvn package을 실행하는 동안이 파일을 어떻게 사용합니까? 같은 받는다는 프로젝트에서 나는이 웹 서비스를 사용하려면, 그래서 내가 이런 걸 쓸 필요는 컴파일 된 클래스를 읽을 필요가 같이 jaxws:gen 목표는 process-classes 단계에서 실행

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

,하지만 jaxws:import이어야합니다 컴파일을 위해 모든 것을 준비하기 위해 generate-sources 단계에서 실행하십시오. 그리고 지금 나는 닭고기 달걀 문제로 달린다. wsgen을 통해 출력 파일을 생성하기 위해 컴파일 된 클래스가 필요하지만, 의 출력 파일은 wsgen이고, 출력은 generate-sources maven입니다. 내 첫 번째 시도는 목표를 generate-sources 단계에도 할당하는 것이었지만 물론 클래스가 작동하지 않으므로 아직 누락되었거나 아직 컴파일되지 않았습니다.

이 문제를 해결하기위한 나의 대안은 무엇입니까? 내가 그렇게 jaxws:wsgen (즉 단계에서) 사용할 수있는 generate-sources 단계 이전 일부 클래스합니다 (@WebService 주석, 즉 클래스 만) 컴파일하는 antrun 목표를 실행하는 경우, 다음 generate-sourcesjaxws:wsimport에서 사용하는 출력 파일을 생성 단계? 이 닭고기 달걀 문제를 해결할 다른 방법이 있습니까? 같은 메이븐 프로젝트에서 웹 서비스의 서버와 클라이언트 부분을 컴파일하기위한 다른 "방법"이 있습니까? 그것은 btw해야합니다. 깨끗한 mvn clean 빌드에서 실행되므로 "mvn package을 두 번 실행하여 webservices 파일을 생성 한 다음 다른 모든 것을 컴파일하는 것과 같은 솔루션을 원하거나 원하지 않습니다." 즉, mvn clean package은 전체 maven 프로젝트/osgi 번들을 컴파일해야합니다.

답변

1

... 전달합니다. 다음 단계를 사용합니다.

  1. 먼저 나는 클래스를 컴파일 할 <javac>를 사용 antrun 실행을 통해 @WebService 주석과 클래스를 컴파일합니다. 결과 클래스 파일을 클라이언트 스텁을 만든 후에 삭제되는 임시 디렉토리에 저장합니다.
  2. jaxws:wsgen 목표로 컴파일 된 .class 파일에서 WSDL 파일을 만듭니다.
  3. 임시 디렉토리에서 보통 jaxws:wsimport 목표로 클라이언트 스텁을 만듭니다.
  4. 두 번째로 antrun 임시 디렉토리를 삭제합니다.

결과 pom.xml 파일 그래서 "생성 된 스텁"이 같은 프로젝트에 필요하지 않은 가정 질문 (단지 관련 부분)

<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

플러그인을 정의하면 wsgen과 다른 wsimport에 대해 각각 별도로 실행을 설정해야합니다.

은 ... 시간이 나는 generate-sources 단계에 jaxsw:wsgen 목표를 이동하여이 문제를 해결하기 위해 관리해야

Use Maven to trigger a wsgen & wsimport in a row, using wsdlLocation

+0

다른의 솔루션을 다음과 같이 보인다. 그러나 이것이 내 프로젝트에서의 경우이기 때문에, 스텁은'generate-source' 단계보다 나중에 생성되어서는 안됩니다. – Progman