동일한 Maven 프로젝트에서 웹 서비스 생성 및 사용
문제
웹 서비스가 포함된 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
단계.나는 다음 단계를 사용합니다.
- 먼저 클래스를 컴파일합니다.
@WebService
주석을 통해antrun
실행, 사용<javac>
클래스를 컴파일합니다.클라이언트 스텁을 생성한 후 삭제되는 임시 디렉토리에 결과 .class 파일을 저장합니다. - 다음을 사용하여 컴파일된 .class 파일에서 WSDL 파일을 생성합니다.
jaxws:wsgen
목표. - 임시 디렉토리에서 일반 클라이언트 스텁을 생성합니다.
jaxws:wsimport
목표. - 두 번째로 임시 디렉토리를 삭제합니다.
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