【问题标题】:jaxws-maven-plugin resolving WSDL location relative to class location, why?jaxws-maven-plugin 解析相对于类位置的 WSDL 位置,为什么?
【发布时间】:2012-12-24 15:48:02
【问题描述】:

我正在使用jaxws-maven-plugin 版本2.1。我发现从 jar 资源中为 WSDL 位置生成了非常奇怪的代码:

                <configuration>
                    <keep>true</keep>
                    <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                    <extension>true</extension>
                    <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                    <packageName>my.package.gen</packageName>
                    <wsdlLocation>wsdl/*</wsdlLocation>
                    <wsdlFiles>
                        <wsdlFile>mywsdl.wsdl</wsdlFile>                            
                    </wsdlFiles>
                </configuration>

而生成的代码是:

static {
    URL url = null;
    try {
        URL baseUrl;
        baseUrl = my.package.gen.My_Service.class.getResource(".");
        url = new URL(baseUrl, "wsdl/mywsdl.wsdl");
    } catch (MalformedURLException e) {
        logger.warning("Failed to create URL for the wsdl Location: 'wsdl/mywsdl.wsdl', retrying as a local file");
        logger.warning(e.getMessage());
    }
    MYSERVICE_WSDL_LOCATION = url; }

所以 wsdl 文件是在生成的类居民的目录(包)中查找的,而不是在主 jar 目录中查找,这是合乎逻辑的。并且找不到 WSDL。

jaxws-maven-plugin中的错误,还是我的配置中的错误?

【问题讨论】:

  • 同时你能找到解决问题的方法吗?我和你面临同样的问题,Samuels 的解决方案真的是一个丑陋的黑客。
  • 这是同一个问题,但有另一种解决方案。 stackoverflow.com/questions/4163586/…

标签: java maven wsdl jax-ws maven-plugin


【解决方案1】:

就我而言,生成的文件缺少class.getClassLoader() 部分。通过在 resources 目录中的目录名称前添加正斜杠 (/) 来修复它,如下所示:&lt;wsdlLocation&gt;/wsdl/*&lt;/wsdlLocation&gt;

完整配置sn-p:

<configuration>
  <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
  <wsdlLocation>/wsdl/*</wsdlLocation>
  <wsdlFiles>
    <wsdlFile>myFile.wsdl</wsdlFile>
  </wsdlFiles>
  <keep>true</keep>
</configuration>

【讨论】:

    【解决方案2】:

    您应该使用 jaxws-maven-plugin 版本 2.3 而不是 2.1,结果将如您所料。

    2.3 版的输出是这样的(如果你的 wsdl 文件夹在 src/main/resources 下):

    URL url = <Any>.class.getClassLoader().getResource("wsdl/anywsdl.wsdl");
    

    【讨论】:

    • 您说它在 jaxws-maven-plugin 的 2.3 版中已修复?我检查了我公司的 Nexus,不幸的是,最高版本是 2.2(除了那里的工件,我不能使用任何东西)。所以我应该建议他们更新版本?您是否有任何指向信息问题的链接,它是在哪个版本中修复的?我需要一些东西来证明这样的更新是必要的。
    • 是的,这是真的。我只将构建中的版本从 2.3 更改回 2.1,以便查看结果与 @Łukasz웃Lツ 相同。就是这样 :-) 我还检查了我的 gradle 构建与 wsimport 任务,它使用了 jax-ws 2.1.4,它也是错误的,所以我已经更新到 jax-ws 2.2.8,问题也在那里解决了。所以 JAX-WS 工具 2.2.8 也可以按要求工作。
    • 我会将这些信息提供给我的公司。如果他们更新插件或通过手动修复来解决这个问题,这取决于他们:)
    • 现在我已经逐步检查了从 2.1.7 到 2.2.3 的 JAX-WS 版本,差异真的很明显 :) 第一次更改发生在 2.2 中,但它没有使用类加载器,只是简单class.getResource() 但已经具有良好的相对路径。 2.2.1 一样,2.2.2 不见了。从 2.2.3 开始,他们使用 .class.getClassLoader().getResource("") 那么什么是好的。
    • sry 但是,绝对尝试了所有.. getClassLoader() 从未出现,切换到 cxf-codegen-plugin 并且一切正常.. stackoverflow.com/questions/4455195/…
    【解决方案3】:

    为了生成

    url = new URL(baseUrl, "wsdl/mywsdl.wsdl");
    

    这是预期的行为,据此,

    http://jax-ws-commons.java.net/jaxws-maven-plugin/wsimport-mojo.html#wsdlLocation

    这取决于你想做什么。

    如果你有什么烦恼

    My_Service.class.getResource(".");

    您可以通过以下方式摆脱点(相对路径):

    <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.0</version>
            <executions>
              <execution>
                <phase>process-sources</phase>
                <goals>
                  <goal>replace</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <file>target/generated-sources/wsimport/lu/hitec/webservices/pssu/${wsdl.app}/${interface.name}_Service.java</file>
              <replacements>
                <replacement>
                  <token>_Service\.class\.getResource\("\."\)</token>
                  <value>_Service\.class\.getResource\(""\)</value>
                </replacement>
              </replacements>
            </configuration>
          </plugin>
    

    【讨论】:

    • 是的,一种解决方法,需要使用外部库(插件)。正如 Miklos Krivan 所写,我希望 jaxws-maven-plugin 版本 2.3 中已修复此问题,在我的情况下,很难说服公司使用更新版本的 jaxws 插件,说服他们使用新插件几乎是不可能的。 .
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2011-06-14
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2012-03-04
    相关资源
    最近更新 更多