3

我一直在使用 wsimport 工具从 WSDL 文件生成客户端类。然后我将它们包含在项目的源代码树中,并将它们检入到版本控制系统中。但最近我了解到有一个名为 jaxws-maven-plugin 的 maven 插件,它可以生成客户端类作为构建步骤 (mvn clean jaxws:wsimport)。

虽然我不清楚使用这个插件的真正好处是什么,除了不需要将 WS 客户端类检查到源代码控制中。尽管如此,如果有人想在项目上工作,他必须检查代码,然后运行 ​​mvn jaxws:wsimport ,然后才能开始工作(否则 IDE 会显示错误)。那么真正的好处是什么?何时应该使用插件而不是将客户端代码签入 VCS?

4

1 回答 1

5

maven 插件的执行可以在构建步骤中自动触发,例如,在项目编译之前,maven 构建周期中有一个专用的“生成源”阶段。因此,开发人员不必记住手动生成它,让您更接近理想的一键式完整构建。

优点是,您可以从 VCS 中排除生成的类,因为它们可以按需重新生成。VCS 中生成代码的问题是,WSDL 文件的更改将触发生成代码的更改(显然)。但是由于您首先要签订合同,因此只有 WSDL 文件中的更改是相关的。从 VCS 中排除生成的代码将从 VCS 提交日志中隐藏其中的冗余更改。您的 VCS 存储库更小,提交日志更清晰。

针对评论进行编辑:恕我直言,对这种情况有两种不同的看法:

1) 客户端类与服务接口的兼容性。

我不确定客户端类是否能够与 WS 通信,如果它们是从旧的 wsdl 生成的。如果更改仅限于其他方法并且不涉及现有定义,我认为它可能会起作用。尽管如此,如果客户端代码总是在构建时重新生成,这不是问题,因为客户端代码会自动与 wsdl 同步。

2) 实现与客户类的兼容性。

如果生成的客户端类由于修改了 wsdl 而发生更改,这可能会破坏使用客户端类的代码。但是,如果只有方法添加到 wsdl 并且现有方法保持原样,则重新生成的客户端类因此应该与现有代码向后兼容。在您的示例中:如果您的代码仅使用 A(),并且“新”客户端类现在除了A() 之外还提供 B(),那么您的代码应该仍然可以工作。

总之; 如果 WSDL 演进是向后兼容的,我认为从 VCS 中排除生成的客户端代码,而是在构建过程中按需生成它应该不会破坏现有的功能代码。如果 WSDL 更改不向后兼容,则会在编译时发生错误。但这些都是不可避免的——使用 VCS 中过时的客户端类实际上可能会隐藏这些错误,直到您尝试执行应用程序。

于 2013-08-27T13:33:02.813 回答