在多个Maven工件上分发XSD文件

时间:2012-01-31 15:44:36

标签: xsd maven-3 netbeans-7 xsd-validation

以下是我想要实现的一个小例子:

Maven Artifact A是众多Web服务中的一种,它定义了一个XSD Schema 请求和响应的定义。 (SRC /主/资源/ XSD)

神器A取决于神器B,它是一个简单的JAR项目并且包含众多 具有低级别类型描述的主XSD。 (SRC /主/资源/ XSD)

工件A中的XSD使用指定的类型定义(包含) 曾经在神器B中。

如果可能的话,我真的想知道如何包含位于jar中的xsd文件,这些文件作为maven依赖项加载,以及如何在像Netbeans和Eclipse这样的IDE中解析webservice xsd(和wsdl)。

如果这种方法看起来很奇特 - 是否有更好的清洁设计实践?

更新

首先,这是一个简单的示例,说明我希望架构包含如何工作....

Artifact A (WAR Module)
POM:
...
<artifactId>A</artifactId>
...
<dependency>
  <artifactId>B</artifactId>
  ...
</dependency>

Schema:
....
<xs:include schemaLocation="classpath://net/elfwyn/xsd/schema.xsd"/>
....

Artifact B (JAR Module)

Schema Location:
src/main/resources/net/elfwyn/xsd/schema.xsd

对于像这样的问题似乎有几个解决方案,但我不知道如何在我的环境中实现它们:

我知道嵌入在(netbeans7.1)IDE中的目录解析器(对于dev environemnt)并且可用作Maven插件(用于生产环境),它应该能够指定模式文件位置的别名。然后应将此别名用作架构位置。

但是我不知道如何指定访问JAR文件中的模式的Catalog.xml。 对我而言,它似乎与直接在架构位置中指定它相同。 还有维护每个WAR项目目录的开销 - 如果可能的话,我宁愿不去做。

关于Maven插件,我还没有找到任何结论。

其他sources正在jax-b的上下文中实现自定义目录解析器, 但是我还没有看到在Java-WS环境中实现这样一个解析器的可能钩子,以及它应该如何与上面提到的maven-plugin或IDE Catalog解析器一起工作......

1 个答案:

答案 0 :(得分:6)

我认为你的问题是合理的。在过去,我经常发现我有一个Maven模块需要对可以在依赖JAR中找到的文件进行特殊处理。

我过去所做的是使Artifact B成为Artifact A的依赖。然后在Artifact A的pom.xml中,我使用Maven依赖插件的特殊配置,如下所示:

<plugin>
    <!-- Used to pull XSD files from the JAR -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
          <execution>
              <id>unpack-xsd-files</id>
              <!-- Using the initialize phase because it is before the generate sources phase -->
              <phase>initialize</phase>
                   <goals>
                       <goal>unpack</goal>
                   </goals>
                   <configuration>
                        <artifactItems>
                            <artifactItem>
                                <!-- Artifact that Holds our custom templates -->
                                <groupId>com.mycorp</groupId>
                                <artifactId>artifact-b</artifactId>
                                <version>${artifact-b.version}</version>
                                <type>jar</type>
                            </artifactItem>
                         </artifactItems>
                         <includes>**/*.xsd</includes>
                         <outputDirectory>${project.basedir}/target/xsd-includes</outputDirectory>
                   </configuration>
            </execution>
    </executions>
</plugin>

现在您感兴趣的XSD文件可以在Artifact A的目标目录中找到,然后您可以在那里随意执行任何操作。您可以将它们包含为资源,从其他XSD文件引用它们,将它们嵌入您自己的JAR或其他任何内容中!从配置中可以看出,您也不必将它们放在目标目录中;您可以将它们直接放入/src/main/resources目录。

您可以将此配置添加到您想要的任何Maven模块,以便多个模块可以以相同的方式工作。这种方法的好处在于它也可以通过M2Eclipse从Eclipse开始工作。