用于Spring WS的Maven项目,用于创建服务器WAR/EAR和客户端JAR的JAXB/XSD,还可以从XSD自动



可能很难准确地解释我想要什么,所以请让我一步一步地做。

我们公司有一个长期存在的Java项目,它使用Spring WS、XSD文件从WSDL生成WSDL和那些bean。项目是使用ANT与各种目标(一个目标从XSD生成类,另一个目标生成客户机JAR,另一个目标生成服务器WAR/EAR)编译/构建的。该项目用于运行SOAP服务器,也用于生成客户端JAR。但是不再有单一的代码源,并且大量预生成的客户机jar到处都是。我需要用Maven来清理这个烂摊子。

我创建了模块化的Maven项目,但基本上唯一真正的子项目是包含所有自定义代码、所有xsd等的项目(另一个子项目只是从第一个项目生成的WAR中打包EAR)。由于该项目使用Spring WS,因此最终的WSDL文件在服务器上运行时动态生成。

到目前为止,我所做的是:

  • 从XSD手动生成类,将这些类添加到/src/main/java中,以便它们永久存储,让Maven生成服务端架构的其余部分(WAR/EAR)。
  • 通过使用eclipse WTP插件(创建新项目,将WSDL放入其中,使用WTP插件生成文件,然后将项目导出到最终的JAR文件)分别使用从运行的服务器导入的WSDL文件生成客户端JAR文件,然后将该JAR分发给感兴趣的各方。

这是可行的,但是正如您所看到的,代码维护过程存在问题(预生成的类包含在主源代码中),生成客户端的过程最好是与主项目分离的。所以这是一个烂摊子,我希望能够清理。

我希望能够做到的是:

  • 创建包含XSD文件的Maven项目
  • 使用它来生成类和客户端JAR
  • 从服务器端项目引用此项目,以便生成的类可以由服务器端代码引用
  • 服务器端项目将使用Spring WS并且能够生成EAR文件

我面临的问题很简单:动态生成WSDL的XSD文件应该真正驻留在服务器项目中,而不是客户机项目中。这些文件需要在/src/main/resources中,因此它们被移动到构建的WAR/EAR文件的类路径中。我可以使用两个不同的XSD副本——一个用于客户端项目,另一个用于服务器端项目,但这听起来不对。

所以我的主要问题是-我如何使用Maven来实现这个项目架构,以便我只使用任何源文件(XSD, Java等)的单个实例,并且我能够方便地从XSD生成类,构建客户端JAR和服务器WAR/EAR。我可以使用两个或更多单独的构建命令—一个生成JAR,另一个从适当的项目源生成EAR。

哦,顺便说一下——重构XSD文件是没有问题的——它们是给我们的,必须按原样使用。

谢谢,Nikolay

为xsd使用单独的项目,并仅使用从xsd生成的类构建另一个JAR。你最终有3个项目:

  • XSD架构项目
  • 客户端JAR
  • 服务器项目

,其中客户端JAR和服务器项目依赖于XSD模式项目。

你可以使用一个父项目,将所有这些项目作为子模块,一次构建整个项目。

如果您担心您的客户端JAR现在实际上是两个JAR(加上可能更多的依赖关系),您可以使用shade插件将XSD模式项目的JAR的内容捆绑到您的客户端JAR中。

创建更多的项目/模块几乎总是比复制代码好。


编辑:要从wsdl和XML Schema生成类,您可以使用Maven JAX-WS插件(wimport goal)和/或Maven JAXB插件。

我们从xsd生成了相当多的代码。因为我们不想要重复的代码,我们使用XML编目和一个自定义模式解析器,它可以从类路径解析模式;我很确定apache有一个模式解析器也可以做到这一点——我记得在我们编写我们的模式解析器之后找到了它。通过这种方式,一个模块可以从另一个模块的工件中引用模式,只需将其声明为依赖项。

最新更新