我正在尝试构建一个 maven 项目,一个 OSGi 包,其中包含 Web 服务。我正在使用带有所有@WebService
注释的 JAX-WS 来指定我拥有的 Web 服务。要在您通常使用的客户端位置加载这些 Web 服务,wsgen
并wsimport
用于导出/导入 WSDL 文件。我打算使用jaxws-maven-plugin这样做,但问题是:
该捆绑包可以同时充当服务器和客户端。它可以将自己注册为同一捆绑包的父节点的客户端(在不同的 JVM/主机上运行)。因此,这个 maven 项目/捆绑包为 web 服务定义了一个接口,并定义了一个实现该接口的实现类。接口和类都@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项目中我想使用这个webservice,所以我需要写这样的东西:
ExampleImplService service = new ExampleImplService();
Example port = service.getExampleImplPort();
port.callMe();
jaxws:gen
目标是在阶段运行,因为process-classes
它需要读取已编译的类,但jaxws:import
必须在generate-sources
阶段运行以准备一切以进行编译。现在我遇到了一个鸡蛋问题。我需要编译的类通过生成输出文件wsgen
,但我需要在maven阶段的wsgen
输出wsimport
文件generate-sources
。我的第一次尝试是将jaxws:wsgen
目标也分配给generate-sources
阶段,但由于类丢失/尚未编译,它当然不起作用。
我有什么办法来解决这个问题?我是否应该在该阶段之前运行一个antrun
目标来编译一些类(即只有带有@WebService
注释的类)generate-sources
以便jaxws:wsgen
可以使用它(在那个阶段),创建输出文件,然后jaxws:wsimport
在该generate-sources
阶段使用?还有其他方法可以解决这个鸡蛋问题吗?在同一个 maven 项目中编译 web 服务的服务器和客户端部分是否还有其他“maven 方式”?它应该顺便说一句。从一个干净的mvn clean
版本运行,所以我不想要/不喜欢任何解决方案,比如“运行mvn package
两次以首先生成 web 服务文件,然后编译其他所有内容”。换句话说:mvn clean package
应该编译整个 maven 项目/osgi 包。