7

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

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

Artifact A 依赖于 Artifact B,它是一个简单的 JAR 项目,包含大量具有低级类型描述的 Master 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 插件,我还没有找到任何结论性的东西。

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

4

1 回答 1

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>

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

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

于 2012-02-10T03:40:25.993 回答