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

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

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

Maven Artifact A 是众多 Web 服务之一,它定义了一个 XSD Schema
请求和响应的定义。 (src/main/资源/xsd)

Artifact A 依赖于 Artifact B,它是一个简单的 JAR 项目,包含大量
具有低级类型描述的主 XSD。 (src/main/资源/xsd)

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

如果可能的话,我真的很想知道如何包含位于作为 maven 依赖项加载的 jar 中的 xsd 文件,以及如何在 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(用于开发环境)中并且可作为 Maven 插件(用于生产环境)中的目录解析器,它应该能够在模式文件的位置指定别名。然后应将此别名用作模式位置。

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

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

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

最佳答案

我认为你的问题是有道理的。过去我经常发现我有一个 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>

现在,您可以在 Artifact A 的目标目录中找到您感兴趣的 XSD 文件,您可以从那里对它们做任何您想做的事情。您可以将它们作为资源包含,从其他 XSD 文件中引用它们,将它们嵌入到您自己的 JAR 中或其他任何东西中!从配置中可以看出,您也不必将它们放在目标目录中;您可以将它们直接放入您的/src/main/resources目录。

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

关于xsd - 在多个 Maven 工件上分发 XSD 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082407/

相关文章:

java - Maven包错误: No compiler is provided in this environment

java - Maven,如何复制文件?

xml - 如何使 XML 模式中的元素可选?

java - 获取特定 xml 元素的 xsd 限制

c# - 如何管理用于XDocument格式化的 "NO-BREAK SPACE"?

java - 将类编码到 XSD :Anytype xml

maven-3 - 将 DCM4CHE 库添加到 Maven 项目

android - 开始使用 NetBeans 开发 Android 应用程序

java - 在 netbeans 中运行主项目时未显示 GUI

git - 在构建过程中获取git分支名称