문제

웹 서비스가 포함된 OSGi 번들인 Maven 프로젝트를 빌드하려고 합니다.저는 JAX-WS를 모두 사용하고 있습니다. @WebService 내가 가지고 있는 웹 서비스를 지정하는 주석입니다.일반적으로 사용하는 클라이언트 위치에서 이러한 웹 서비스를 로드하려면 wsgen 그리고 wsimport WSDL 파일 내보내기/가져오기용.나는 다음을 사용할 계획이다. jaxws-maven-플러그인 그렇게 하려고 하는데 문제는 다음과 같습니다.

번들은 서버와 클라이언트 역할을 동시에 수행할 수 있습니다.동일한 번들(다른 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 목표 주석을 읽고 출력 파일(구성에 따라 .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 메이븐 단계.나의 첫 번째 시도는 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 번들을 컴파일해야 합니다.

도움이 되었습니까?

해결책

나는 이동하여 이 문제를 해결했습니다. jaxsw:wsgen 목표는 generate-sources 단계.나는 다음 단계를 사용합니다.

  1. 먼저 클래스를 컴파일합니다. @WebService 주석을 통해 antrun 실행, 사용 <javac> 클래스를 컴파일합니다.클라이언트 스텁을 생성한 후 삭제되는 임시 디렉토리에 결과 .class 파일을 저장합니다.
  2. 다음을 사용하여 컴파일된 .class 파일에서 WSDL 파일을 생성합니다. jaxws:wsgen 목표.
  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>

다른 팁

플러그인을 정의하는 곳은 두 개의 개별 실행 실행을 설정해야합니다. WSGEN 및 다른 WSIMPORT 용 하나입니다.

... 시간 전달 ...

Maven을 사용하여wsglous 행의 wsgen & wsimport

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top