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

Soap SpringWS的Maven项目,用于创建服务器WAR/EAR和客户端JAR的JAXB/XSD,还可以从XSD自动生成类,soap,maven,jaxb,spring-ws,Soap,Maven,Jaxb,Spring Ws,可能很难确切地解释我想要什么,所以请让我一步一步地做 我们公司有一个长期存在的Java项目,它使用SpringWS、XSD文件从WSDL生成WSDL和那些bean。该项目是使用ANT编译/构建的,具有各种目标(一个目标从XSD生成类,另一个目标生成客户机JAR,另一个目标生成服务器WAR/EAR)。该项目用于运行SOAP服务器,还用于生成客户端JAR。但现在已经没有单一的代码源了,大量预先生成的客户端jar正在四处传播。我需要用Maven清理这个烂摊子 我创建了模块化Maven项目,但基本上唯一

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

我们公司有一个长期存在的Java项目,它使用SpringWS、XSD文件从WSDL生成WSDL和那些bean。该项目是使用ANT编译/构建的,具有各种目标(一个目标从XSD生成类,另一个目标生成客户机JAR,另一个目标生成服务器WAR/EAR)。该项目用于运行SOAP服务器,还用于生成客户端JAR。但现在已经没有单一的代码源了,大量预先生成的客户端jar正在四处传播。我需要用Maven清理这个烂摊子

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

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

  • 手动从XSD生成类,将这些类添加到/src/main/java,以便永久存储它们,让Maven生成服务端架构(WAR/EAR)的其余部分
  • 单独使用从运行服务器导入的WSDL文件,使用EclipseWTP插件生成客户机JAR文件(创建新项目,将WSDL放入其中,使用WTP插件生成文件,然后将项目导出到最终JAR文件),然后将此JAR分发给相关方
这是可行的,但正如您看到的代码维护过程有问题(预生成的类包含在主源代码中),生成客户机的过程充其量是与主项目分离的。所以这是一个混乱,我希望能够清理

我希望能够做到的是:

  • 创建承载XSD文件的Maven项目
  • 使用它来生成类和客户机JAR
  • 从服务器端项目引用此项目,以便服务器端代码可以引用生成的类
  • 服务器端项目将使用SpringWS并能够生成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(加上可能更多的依赖项),那么您可以使用将XSD模式项目的JAR的内容捆绑到客户机JAR中

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



编辑:要从wsdl和XML模式生成类,可以使用(wsimport目标)和/或。

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

您是否建议使用该架构解析器在运行的服务器上生成最终的wsdl?我们目前使用Spring的CommonsXsdSchemaCollection,它从Apache实现XsdSchemaCollection。我将检查这个类是否可以查找类路径而不是文件位置(我们当前使用的)来获取源XSD文件。如果这是可行的,这可能是我们的解决方案!ThanksHow您是否从模式生成WSDL?你问题的这一方面让我很困惑。Spring在运行时确实如此。我假设CommonsXsdSchemaCollection类(或其他一些bean)负责这一点,因为它被配置为带有这些XSD的bean。我继承了这个项目,但仍在努力找出如何改进EthatAnks以获得良好的参考(shade),它可能有助于打包最终的JAR/EAR文件。我仍然需要弄清楚如何生成wsdl(tdrury@has suggestion)以及如何自动生成实际的SOAP客户端——还记得我说过我们使用Eclipse的WTP插件来实现这一点吗?它实际上生成了一些用于调用服务器的存根,而不仅仅是来自WSDL的类。我希望Maven也能调用自动生成。谢谢你的意见@Nikolay添加了到JAX-WS/JAXB插件的链接,它们应该有助于从WSDL/XML模式生成类。来自JAX-WS-commons的JAX-WS正在使用其他库,因此生成的客户机JAR与axis不兼容。我必须找到使用axis的方法。我发现了这个相当过时的插件,它使用的似乎是版本1o