Maven用于构建SOA服务和客户端?

时间:2011-04-29 22:41:05

标签: wsdl pom.xml

我更改了标题以概括这个问题,这个问题并非特定于Axis2。我最终完全放弃了Axis2并切换到了Metro / JAX-WS,但我现在正在认真考虑放弃两者并切换到OpenSAML。我在这里努力得到解答的真正问题是,如何构建实际工作的复杂的基于标准的SOA服务。

最初的措辞是:有人可以粘贴maven pom的工作示例来调用我可以使用的默认值的Axis2 java2wsdl吗?这是一个命令行咒语,表现得很好。

  -o target/generated-sources/java2wsdl \
  -l "http://localhost:9763/services/PolicyService" \
  -tn urn:sesgg:sc:security:1.0.spec.PolicyService \
  -tp ps \
  -stn urn:oasis:names:tc:SAML:2.0:protocol \
  -stp samlp \
  -of PolicyService.wsdl \
  -sn PolicyService \
  -cp "../../Schema/target/Schema-1.0-SNAPSHOT.jar target/PolicyService-1.0-SNAPSHOT.jar" \
  -cn com.technica.pbac.ps.PolicyService \

我所做的一切都结果非常明显;例如怪异的反向名称空间(例如http://xmldsig._09._2000.w3.org/xsd)。你能解释一下这是为什么以及如何阻止它吗?

似乎有很多java2wsdl在那里期望完全不同的参数,命令行和maven pom之间几乎没有一致性。

3 个答案:

答案 0 :(得分:1)

没有回复所以我会发布我自己实验的当前结果来帮助其他人 类似的问题。在测试完成之前无法保证这是正确的,但至少现在我已经得到了我在Eclipse中可以看到的结果:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.7.5</version>
            <configuration>
                <schemaExcludes>
                    <exclude>*saml*.xsd</exclude>
                </schemaExcludes>
                <strict>true</strict>
                <extension>true</extension>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-java2wsdl-maven-plugin</artifactId>
            <version>1.5.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java2wsdl</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <id>Generate WSDL based on PolicyService Interface</id>
                <serviceName>PolicyService</serviceName>
                <className>com.technica.pbac.ps.PolicyServiceImpl</className>
                <targetNamespace>http://sesgg/sc/security/1.0/spec/PolicyService</targetNamespace>
                <targetNamespacePrefix>sesgg</targetNamespacePrefix>
                <schemaTargetNamespace>http://sesgg/sc/security/1.0/spec/PolicyService</schemaTargetNamespace>
                <schemaTargetNamespacePrefix>sesgg</schemaTargetNamespacePrefix>
                <elementFormDefault>qualified</elementFormDefault>
                <extension>false</extension>
                <package2Namespace>
                    <property>
                        <name>urn:sesgg:sc:security:1.0:spec:PolicyService</name>
                        <value>http://sesgg/sc/security/1.0/spec/PolicyService</value>
                    </property>
                    <property>
                        <name>com.technica.pbac.ps</name>
                        <value>http://com.technica.pbac.ps</value>
                    </property>
                    <property>
                        <name>oasis.names.tc.saml._2_0.protocol.xsd</name>
                        <value>http://oasis/names/tc/saml/2.0/protocol</value>
                    </property>
                    <property>
                        <name>oasis.names.tc.saml._2_0.protocol</name>
                        <value>http://oasis/names/tc/saml/2.0/protocol</value>
                    </property>
                </package2Namespace>
                <episodes>
                    <episode>
                        <groupId>Technica-PBAC</groupId>
                        <artifactId>Schema-1.0-SNAPSHOT.jar</artifactId>
                    </episode>
                </episodes>
                <outputFileName>target/generated-sources/java2wsdl/PolicyService.wsdl</outputFileName>
                <filename>target/generated-sources/java2wsdl/services.xml</filename>
                <locationUri>http://localhost:9763/services/PolicyService</locationUri>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
            <version>1.5.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsdl2code</goal>
                    </goals>
                    <configuration>
                        <wsdlFile>target/generated-sources/java2wsdl/PolicyService.wsdl</wsdlFile>
                        <packageName>com.technica.pbac.ps</packageName>
                        <outputDirectory>target/generated-sources/wsdl2java</outputDirectory>
                        <unwrap>true</unwrap>
                        <allPorts>true</allPorts>
                        <databindingName>adb</databindingName>
                        <generateServerSide>true</generateServerSide>
                        <generateAllClasses>true</generateAllClasses>
                        <generateServicesXml>true</generateServicesXml>
                        <generateTestcase>true</generateTestcase>
                        <overWrite>true</overWrite>
                        <serviceName>PolicyService</serviceName>
                        <syncMode>sync</syncMode>
                        <backwardCompatible>false</backwardCompatible>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-java2wsdl-maven-plugin</artifactId>
                <version>1.5.4</version>
            </plugin>
            <plugin>
                <groupId>org.apache.axis2</groupId>
                <artifactId>axis2-wsdl2code-maven-plugin</artifactId>
                <version>1.5.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

一个警告:我真的怀疑它是运行jaxb,java2wsdl,wsdl2java并在一个pom中编译阶段的权利。目前java2wsdl在 wsdl2java之后以这种方式运行,这显然是不对的。这个pom是双重怀疑,因为java2wsdl需要一个编译的jar来运行,并且似乎正在使用之前运行中剩下的那个。在mvn clean之后再次工作是熊。我可能会把它分成几个poms并在我做的时候调整这个答案。

答案 1 :(得分:0)

我答应用大约“正确”的东西来扩展这个答案。这是迄今为止的进展,我仍然不能确定100%正确。稍后会详细介绍。

这完全基于Oasis发布的模式堆栈,用于为XACML标准定义XACML和SAML-P。 XSD已被收集到一个Commons-Schema模块(未显示)中,经过调整以修复几个Oasis错误,并使用JAX-B编译为Java类。这些类是下述服务的基础。 schema.episode.path和schema.catalog.path属性指向此模块中的文件。

我将每个服务(在本例中为PolicyService)拆分为两个maven模块。 PolicyService-Svc是服务,它的pom如下所示:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>Generate WSDL</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>wsgen</goal>
      </goals>
      <configuration>
        <sei>com.technica.pbac.ps.PolicyService</sei>
        <genWsdl>true</genWsdl>
        <keep>true</keep>
        <verbose>true</verbose>
        <extension>true</extension>
        <catalog>${schema.catalog.path}</catalog>
        <xjcArg>-episode</xjcArg>
        <xjcArg>${schema.episode.path}</xjcArg>
        <xjcArg>-catalog</xjcArg>
        <xjcArg>${schema.catalog.path}</xjcArg>
      </configuration>
    </execution>
  </executions>
</plugin>

PolicyService-Proxy是任何客户端或服务可用于调用该服务的通用代理代码(有关此问题的更多信息,请参见下文)。它的pom看起来像这样:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <executions>
    <execution>
      <!-- <phase>generate-sources</phase> -->
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <wsdlFiles>
          <wsdlFile>localhost_8080/PolicyService-Svc/PolicyService.wsdl</wsdlFile>
        </wsdlFiles>
        <wsdlLocation>http://localhost:8080/PolicyService-Svc/PolicyService?WSDL</wsdlLocation>
        <sourceDestDir>${project.build.directory}/generated-sources/jaxws</sourceDestDir>
        <genWsdl>true</genWsdl>
        <verbose>true</verbose>
        <extension>true</extension>
        <catalog>${schema.catalog.path}</catalog>
        <xjcArg>-episode</xjcArg>
        <xjcArg>${schema.episode.path}</xjcArg>
      </configuration>
    </execution>
  </executions>
</plugin>

现在问题,我真的很感激建议。尽管Commons-Schema为所有模式提供了编译的java类,但wsgen坚持使用新生成的xsds生成wsdl,这些xsds在各方面略有不同且略有不正确。

作为一个不正确和不同的示例,SAML定义了一个与另一个模式中的相同名称冲突的Extensions元素。所以我在Commons-Schema这样修复它:

<element name="Extensions" type="samlp:ExtensionsType">
    <annotation>
        <appinfo>
        <jxb:class name="Extensions-SAML"/>
       </appinfo>
</annotation>
</element>

但是wsgen / wsimport省略了这种更正,因此冲突再次出现。令人愤怒,绝对致命。

另一个是省略必需的包含,因此eclipse验证会将它们报告为错误,直到手动纠正。我的解决方法是定期将生成的wsdl和xsds从目标文件夹复制到src / main / webapp / WEB-Inf / wsdl,手动修复它们,然后调整poms以使用此文件夹而不是生成的目标文件夹。这适用于从非服务客户端调用服务。我将相同的wsdls和xsds复制到类似的客户端文件夹,并确保pom引用这些,而不是jaxws在该模块中生成的那些。

当任何服务需要通过其代理调用另一个服务时,我无法解决的问题。调用服务的代理jar(具有稍微不同的重要基础类版本)现在与调用服务jar(基于Commons-Schema的JAXB生成的类)混合在一起,这不会导致麻烦。

有人可以提供建议吗?谢谢!

答案 2 :(得分:0)

这个问题的最终答案确实是放弃尝试修复已破坏的模式和工具并切换到已经完成的OpenSAML。这适用于XACML 2.0编译器和基于它的Web服务。但是对于XACML 3.0编译器来说它没有变通,因为OpenSAML不支持XACML 3.0并且没有计划这样做,所以我必须自己处理。但是随着XACML 2.0经验的积累,我最终得到了两个工作。这个项目比以前更加痛苦,“强大”的工具让它变得更难。