Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Maven和cxf codegen插件在JAR中打包WSDL客户端_Java_Maven_Cxf_Webservice Client_Cxf Codegen Plugin - Fatal编程技术网

Java 使用Maven和cxf codegen插件在JAR中打包WSDL客户端

Java 使用Maven和cxf codegen插件在JAR中打包WSDL客户端,java,maven,cxf,webservice-client,cxf-codegen-plugin,Java,Maven,Cxf,Webservice Client,Cxf Codegen Plugin,我有一个maven项目,它将使用许多Web服务。该应用程序将打包为WAR。到目前为止,客户端的代码是在生成源代码阶段使用cxf codegen插件生成的。默认情况下,生成的源被放置在target/generated sources/cxf中,在compile之后,它们被编译并与target/classes中的应用程序类混合。生成的类和应用程序类都可以共享第一级包 我希望每个客户端都打包在WAR文件中自己的JAR中WEB-INF/lib。我发现了-clientjar,但它只生成.jar文件并将它们

我有一个maven项目,它将使用许多Web服务。该应用程序将打包为WAR。到目前为止,客户端的代码是在
生成源代码
阶段使用
cxf codegen插件
生成的。默认情况下,生成的源被放置在
target/generated sources/cxf
中,在
compile
之后,它们被编译并与
target/classes
中的应用程序类混合。生成的类和应用程序类都可以共享第一级包

我希望每个客户端都打包在WAR文件中自己的JAR中
WEB-INF/lib
。我发现了
-clientjar
,但它只生成
.jar
文件并将它们放入
目标/生成的源代码/cxf
,jar也会与编译的类一起进入
目标/类
,这是毫无意义的

我假设
compile
插件在某个时候正在将生成的源代码编译成
target/classes
,可能另一个阶段也在将jar移动到那里。有没有可能让Maven避免编译那些生成的源代码(或者甚至让
cxf codegen plugin
根本不生成源代码,只生成JAR),并根据cxf生成的JAR编译应用程序类

我知道通过为每个Web服务定义一个带有jar打包模块的多模块项目来实现这一点是可能的,但我希望避免使用此选项。可能存在大量Web服务,因此不适合为每个Web服务维护独立的模块。使用
-clientjar
我已经被迫为每个WSDL定义一个
,以便为每个WSDL提供JAR名称(不可能让
cxf codegen插件只扫描
src/main/resources/WSDL

当然,客户机JAR可以在Maven外部生成并安装到本地存储库,并在项目中定义为依赖项,但我想知道是否可以在单个Maven构建中实现这一点

对于程序集,我可能会理清如何将
-clientjar
生成的JAR文件放入
WEB-INF/lib
中,但在WAR中生成的类仍然存在问题


我对Maven构建生命周期及其可能性没有深入的了解,任何建议或建议都是非常受欢迎的。

这是我采用的方法。这并不是我想要的,对于每个WSDL文件,仍然有大量的手工工作要做,这与我所想到的解决方案相去甚远(让Maven为项目中的每个WSDL自动创建单独的JAR构件,并将它们用作依赖项)

具体而言,对于每个WSDL,此方法需要:

  • 创建包含WSDL文件的目录和包含不同工件名称的
    pom.xml
  • 将该目录添加到顶级聚合器POM
  • 在webapp的POM中向WS-client-JAR工件添加依赖项

  • 我最终创建了一个聚合器(multimultimodule)Maven项目,每个WebService客户机有一个模块,它将生成一个带有生成的WS客户机类的JAR工件(遵循Maven关于每个POM一个工件的约定)

    为了方便起见,将负责WebService客户端类生成的插件只在主
    pom.xml
    中定义了一次,并且该pom是WS-client生成pom的父级。重要的是要注意聚合器和父POM之间的差异。在这种方法中,这两个概念一起使用

    还有一个用于主webapp的模块。它的
    pom.xml
    指定了每个WS-client 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>
    

    这就是我采取的方法。这并不是我想要的,对于每个WSDL文件,仍然有大量的手工工作要做,这与我所想到的解决方案相去甚远(让Maven为项目中的每个WSDL自动创建单独的JAR构件,并将它们用作依赖项)

    具体而言,对于每个WSDL,此方法需要:

  • 创建包含WSDL文件的目录和包含不同工件名称的
    pom.xml
  • 将该目录添加到顶级聚合器POM
  • 在webapp的POM中向WS-client-JAR工件添加依赖项

  • 我最终创建了一个聚合器(multimultimodule)Maven项目,每个WebService客户机有一个模块,它将生成一个带有生成的WS客户机类的JAR工件(遵循Maven关于每个POM一个工件的约定)

    为了方便起见,将负责WebService客户端类生成的插件只在主
    pom.xml
    中定义了一次,并且该pom是WS-client生成pom的父级。重要的是要注意聚合器和父POM之间的差异。在这种方法中,这两个概念一起使用

    还有一个用于主webapp的模块。它的
    pom.xml
    指定了每个WS-client 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>
    

    似乎在要求类似的东西。我最终创建了一个包含主项目和另一个聚合器以及父项目的聚合器,该聚合器和父项目将使其子项
    wsdl2java
    每个
    wsdl
    都位于子文件夹中的一个jar中。这不完全是我想要的,但效果很好(包括编写一个虚拟的
    pom.xml
    文件来指定工件名称和groupId,并将其添加到父级的
    中,以供每个新的WS客户端添加)。为什么不将解决方案作为答案而不是注释发布呢?回答很好。向上投票。似乎在要求类似的东西。我