我有一个xml模式(xsd)文件,它位于将包含在运行时类路径中的jar文件中。在我的Wsdl中,我需要通过在jar文件中给出位置来导入模式。
我尝试使用XML目录,但我使用的服务器(websphere)不解析XML目录引用。
我们遇到了一个类似的问题,包含XSD的JAR被添加到类路径中,我们必须使用schemaLocation从WSDL引用它。我们的项目是基于maven的,所以我们使用maven依赖插件的解包目标在编译之前将文件下载到resources文件夹。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>generate-sources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>group</groupId>
<artifactId>artifact</artifactId>
<version>${version}</version>
<outputDirectory>${basedir}/src/main/resources/xsd</outputDirectory>
<includes>ToDownload.xsd</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
这导致xsd被下载到名为xsd的文件夹中的resources目录中
在WSDL schemaLocation="xsd/ToDownload.xsd".
中这样可以确保在编译期间,WSDL将引用已下载并在本地可用的XSD。
jar文件中包含的任何文件都有自己的URL。例如,如果您的jar文件的绝对路径名(在Windows上):
C:projectjarssomestuff.jar
以及包含在该jar中的模式的路径名(相对于jar的根):
/xml/schemas/myschema.xsd
则模式文件的完整URL将为:
jar:file:/C:/project/jars/somestuff.jar!/xml/schemas/myschema.xsd
此外,如果您的XML模式包含对该jar中也存在的其他模式的引用,您可以使用相对路径名(相对于给定的模式)。
例如,假设myschema.xsd
导入在该jar中找到的另一个模式:
/xml/schemas/general/types.xsd
然后,<xs:import>
元素可以这样指定:
<xs:import namespace="http://www.company.org/general/types"
schemaLocation="general/types.xsd"/>
这将导致从相同的jar文件加载CCD_ 4。
您不能将模式作为文件访问。您需要将其作为流进行访问。
Schema schema = schemaFactory.newSchema(new StreamSource(new InputStreamReader(getClass().getResourceAsStream("/xml/schemas/general/types.xsd"))));