我有一个maven项目会占用大量的网络服务。该应用程序将打包为WAR。到目前为止客户'代码已在cxf-codegen-plugin
阶段使用generate-sources
生成。默认情况下,生成的源位于target/generated-sources/cxf
,在compile
之后,它们将被编译并与target/classes
中的应用程序类混合。生成的和应用程序类都可以共享第一级包。
我希望将每个客户端打包在WAR文件中WEB-INF/lib
内的JAR中。我发现了-clientjar
,但它只会生成.jar
个文件并将它们放入target/generated-sources/cxf
,并且JAR也会在target/classes
中与编译后的类一起结束,毫无意义。
我认为compile
插件在某个时刻正在将生成的源编译为target/classes
,并且可能另一个阶段也在那里移动JAR。是否有可能让Maven避免编译那些生成的源(甚至让cxf-codegen-plugin
根本不生成任何源,只生成JAR),并针对CXF生成的JAR编译应用程序类?
我知道可以通过为每个Web服务定义一个带有jar包装模块的多模块项目来实现这一目标,但我想避免使用此选项。可能存在大量的Web服务,并且不适合为每个服务维护独立的模块。使用-clientjar
我已经被迫为每个WSDL定义<wsdlOption>
,以便为每个WSDL提供JAR名称(不能让cxf-codegen-plugin
只是src/main/resources/wsdl
扫描<wsdlRoot>
或-clientjar
)。
当然,客户端JAR可以在Maven外部生成并安装到本地存储库,并在项目中定义为依赖项,但是我想知道它是否可以在单个Maven构建。
对于程序集,我可能会理解如何将WEB-INF/lib
生成的JAR文件放入{{1}},但WAR内部生成的类仍然存在问题。
我不太了解Maven构建生命周期及其可能性,非常欢迎任何建议或指示。
答案 0 :(得分:4)
这是我采取的方法。它不是我想要的,还有很多手工工作要处理每个WSDL文件,并且远非我想到的解决方案(让Maven自动为每个wsdl创建单独的JAR工件)项目并将它们用作依赖项)。
具体来说,对于每个WSDL,这种方法需要:
pom.xml
我最终创建了一个聚合器(多模块)Maven项目,每个WebService客户端都有一个模块,它将生成一个带有生成的WS客户端类的JAR工件(遵循Maven的每个工件的约定) POM )。
为方便起见,将负责生成WebService客户端类的插件仅在主pom.xml
中定义一次,并且此POM是WS客户端生成POM的父级。重要的是要注意聚合器和父POM之间的区别。这两种概念在这种方法中一起使用。
还有一个主要webapp模块。它的pom.xml
指定了每个WS客户端JAR工件的依赖关系。
这是项目目录树的大纲:
| pom.xml
+-- WSClient1
| | WebService1.wsdl
| | pom.xml
+-- WSClientN
| | WebServiceN.wsdl
| | pom.xml
\---MyWebapp
| src
| pom.xml
聚合器POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.myproject</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>Aggregator POM</name>
<properties>
<!-- CXF version used for cxf-codegen-plugin -->
<cxf.version>2.7.10</cxf.version>
</properties>
<modules>
<!-- WS Client Modules -->
<module>WSClient1</module>
<module>WSClientN</module>
<!-- WAR Module -->
<module>MyWebapp</module>
</modules>
<!-- Project configuration every child POM will inherit -->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<!-- WSDL files will be at each project's root level -->
<wsdlRoot>.</wsdlRoot>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
每个WS客户端POM都非常简单,只是一个工件名称并指定父级:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.myproject</groupId>
<artifactId>wsclient1</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>WebService1 client</name>
<parent>
<groupId>com.example.myproject</groupId>
<artifactId>parent</artifactId>
<version>1.0.0</version>
</parent>
</project>
网络应用程序的POM不需要成为父POM的子项,因为它不会使用cxf-codegen-plugin
,并且每个都包含<dependency>
个WS客户端工件之一:
<dependency>
<groupId>com.example.myproject</groupId>
<artifactId>wsclient1</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.example.myproject</groupId>
<artifactId>wsclientN</artifactId>
<version>1.0.0</version>
</dependency>