Java jaxws maven插件解析相对于类位置的WSDL位置,为什么?
我正在使用Java jaxws maven插件解析相对于类位置的WSDL位置,为什么?,java,maven,wsdl,jax-ws,maven-plugin,Java,Maven,Wsdl,Jax Ws,Maven Plugin,我正在使用jaxws-maven插件version2.1。我发现了从jar资源中为WSDL位置生成的非常奇怪的代码: <configuration> <keep>true</keep> <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
jaxws-maven插件version2.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>
URL url = <Any>.class.getClassLoader().getResource("wsdl/anywsdl.wsdl");
因此,wsdl文件是在生成的类驻留的目录(包)中查找的,而不是在主jar目录中查找的,这是合乎逻辑的。并且找不到WSDL
这是jaxws maven插件中的错误还是我的配置中的错误?用于生成
url = new URL(baseUrl, "wsdl/mywsdl.wsdl");
这是预期的行为,根据这个
这取决于你想做什么
如果你有什么麻烦
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>
com.google.code.maven-replacer-plugin
替代者
1.5.0
过程源
代替
目标/生成的源代码/wsimport/lu/hitec/webservices/pssu/${wsdl.app}/${interface.name}\u Service.java
_服务\.class\.getResource\(“\.”)
_服务\.class\.getResource\(“”)
您应该使用jaxws maven插件版本2.3,而不是2.1,结果将与您预期的一样
版本2.3的输出如下(如果您的wsdl文件夹位于src/main/resources下):
URL=.class.getClassLoader().getResource(“wsdl/anywsdl.wsdl”);
在我的例子中,生成的文件缺少类.getClassLoader()
部分。通过在resources
目录中的目录名之前添加正斜杠(/)修复了此问题,如下所示:/wsdl/*
完整配置代码段:
<configuration>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlLocation>/wsdl/*</wsdlLocation>
<wsdlFiles>
<wsdlFile>myFile.wsdl</wsdlFile>
</wsdlFiles>
<keep>true</keep>
</configuration>
src/main/resources/wsdl
/wsdl/*
myFile.wsdl
真的
同时,您能找到解决问题的方法吗?我面临着和你一样的问题,萨缪尔的解决方案真的是一个丑陋的黑客。这里有一个相同的问题和另一个解决方案。你说它在jaxws maven插件的2.3版中得到了修复?我检查了我公司的Nexus,不幸的是最高版本是2.2(除了那里的工件,我不能使用任何东西)。所以我应该建议他们更新版本?您是否有任何与信息相关的链接,它是在哪个版本中修复的?我需要一些东西来证明这样的更新是必要的。是的,这是真的。我只将构建中的版本从2.3改回了2.1,以查看结果是否与@Łukasz相同웃Lツ . 就是这样:-)我还检查了我的gradle build with 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(“”),那么好的一个是什么呢。。getClassLoader()从未出现,切换到cxf codegen插件,一切正常。。是的,一个解决方案,需要使用外部库(插件)。我希望这在jaxws maven插件的2.3版中得到修复,正如Miklos Krivan所写,在我的情况下,很难说服公司使用新版本的jaxws插件,说服他们使用新插件几乎是不可能的。。。
<configuration>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlLocation>/wsdl/*</wsdlLocation>
<wsdlFiles>
<wsdlFile>myFile.wsdl</wsdlFile>
</wsdlFiles>
<keep>true</keep>
</configuration>