以下是我想要实现的一个小例子:
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解析器一起工作......
答案 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开始工作。