如何在jar文件中引用xsd schemalocation?

时间:2013-07-17 05:24:44

标签: xml jar xsd

我有一个xml架构(xsd)文件,该文件位于将包含在运行时类路径中的jar文件中。在我的Wsdl中,我需要通过在jar文件中给出位置来导入模式。

我尝试使用XML目录,但我使用的服务器(websphere)无法解析xml目录引用。

3 个答案:

答案 0 :(得分:3)

jar文件中包含的任何文件都有自己的URL。 例如,如果您的jar文件绝对路径名(在Windows上):

C:\project\jars\somestuff.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"/>

将导致types.xsd从同一个jar文件加载。

答案 1 :(得分:3)

我们遇到了类似的问题,其中包含XSD的JAR被添加到类路径中,我们不得不使用schemaLocation从WSDL引用它。 我们的项目是基于maven的,所以我们使用maven-dependency-plugin的解包目标在编译之前将文件下载到资源文件夹。

<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的文件夹中的资源目录 在WSDL中schemaLocation="xsd/ToDownload.xsd". 这确保了在编译期间WSDL将引用已下载并在本地可用的XSD。

答案 2 :(得分:0)

您不能将模式作为文件访问。您需要以流的形式对其进行访问。

Schema schema = schemaFactory.newSchema(new StreamSource(new InputStreamReader(getClass().getResourceAsStream("/xml/schemas/general/types.xsd"))));