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

elf*_*wyn 7 xsd maven-3 xsd-validation netbeans-7

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

Maven Artifact A是许多Web服务之一,它定义了一个XSD Schema,其中包含Requests和Responses的定义.(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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

HDa*_*ave 6

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

我过去所做的是使Artifact B成为Artifact A的依赖.然后在Artifact AI的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>
Run Code Online (Sandbox Code Playgroud)

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

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