2012-01-31 68 views
7

這裏是我想達到什麼樣的一個小例子:分發XSD文件在多個Maven構件

Maven構件A是許多Web服務之一,並定義了XSD架構與請求和響應 定義。 (src/main/resources/xsd)

工件A取決於工件B,這是一個簡單的JAR項目,包含主XSD的衆多 低級別類型描述。這是在神器B.指定 一次

如果可能的話,我真的很想中(src /主/資源/ XSD)

在僞影的XSD文件使用的類型定義(包括)知道如何包括位於作爲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 

似乎有有幾個sollutions對於這樣的問題,但我不知道如何在我的環境中實現它們:

我知道嵌入在(netbeans7.1)IDE(用於開發環境)中的目錄解析器,並且可用作Maven插件(用於生產環境) at應該能夠在模式文件的位置上指定別名。這個別名應該被用作模式位置。

但是我不知道如何指定一個訪問JAR文件中的模式的Catalog.xml。 對我來說,它似乎與直接在模式位置中指定它相同的問題。 還有維護每個戰爭目錄的開銷 - 項目至多我不願意採取,如果可能的話。

關於Maven插件,我還沒有發現任何確鑿的結論。

其他sources正在實施JAX-B, 的背景下,自定義目錄解析器,但我還沒有看到一個可能鉤在Java-WS環境中實現這樣的解析器,以及應如何協同工作與上面提到的Maven插件或IDE目錄解析器...

回答

6

我認爲你的問題是合理的。在過去,我經常發現我有一個Maven模塊,需要對可以在依賴JAR中找到的文件進行特殊處理。

我過去所做的就是讓神器神器乙A的依賴性然後在神器AI的pom.xml中使用Maven Dependency插件的特殊配置如下:

<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一起工作。

+0

我仍然沒有時間檢查自己的溶劑,但由於聽起來非常合理,賞金很快就會用完,我會將此作爲正確答案。謝謝! – elfwyn 2012-02-13 07:55:02

+0

@Stefan - 非常感謝,如果您有任何問題,請在這裏留言,我們將全力以赴。 – HDave 2012-02-13 13:48:31

+0

如果你將它綁定到'initialize',有時'target'目錄將不存在。我也遇到了很多問題(在Eclipse中,但也使用'mvn:compile'),可怕的'源碼不能是一個目錄',這是一個5年前的maven bug。無論如何,因爲它是最乾淨的解決方案。 – artbristol 2012-02-20 13:09:18