2011-07-15 48 views
6

快速簡報我的情況 - 我正在研究具有JAX-WS批註接口/類的代碼庫我們從中生成代碼優先的wsdls。我們使用CXF的cxf-java2ws-plugin在maven中構建時生成wsdls,以包含在爲每個模塊生成的.jar中。

我們想要做的是這些WSDL文件部署到Maven倉庫,因爲Maven倉庫可以爲

  • 充當一個臨時搭建的服務存儲庫(如描述here
  • 讓客戶容易方式所指向的行家使用cxf codegen plugin座標的WSDL,而不是管理的WSDL文件本身

我已經走到這一步,是使用依賴一個POM文件:解壓依存關係來獲取所有的項目中的wsdl文件放到這個模塊$ {project.build.directory}中的一個目錄中(通常稱爲target/to everyone out)。

我不知道該怎麼做,是循環遍歷每個文件,並在每個wsdl上調用deploy:deploy-file mojo。我在這裏有什麼選擇,因爲我真的想自動化部署這些wsdl文件的過程,並且沒有任何人可以手動部署它們?

爲了完整起見,這裏是POM文件:

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
     xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <artifactId>rice</artifactId> 
     <groupId>org.kuali.rice</groupId> 
     <version>2.0.0-m7-SNAPSHOT</version> 
    </parent> 
    <artifactId>rice-dist-wsdl</artifactId> 
    <name>Rice WSDL Distributions</name> 
    <packaging>pom</packaging> 

    <properties> 
     <wsdl.location>${project.build.directory}/wsdl</wsdl.location> 
    </properties> 


    <!-- Depends on all API modules and modules that generate or contain wsdls --> 
    <dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-core-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-kew-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-kim-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-krms-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-ksb-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-shareddata-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>unpack-wsdls</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack-dependencies</goal> 
         </goals> 
         <configuration> 
          <includes>**\/*.wsdl</includes> 
          <outputDirectory>${project.build.directory}</outputDirectory> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

其中在靶/ WSDL塞到所述的WSDL(/它們包含WSDL內內的每個的.jar被他們依賴的):

[[email protected] ~/Repositories/Kuali/rice/dist-wsdl] 
> find . -iname '*.wsdl' | head -3 
./target/wsdl/CampusService.wsdl 
./target/wsdl/CountryService.wsdl 
./target/wsdl/CountyService.wsdl 

解決方案

思想WHA我實施的方式與Ryan Steward提供的接受答案不同,我接受了他的答案,因爲它讓我寫自己的答案。

基本上,這裏是一個maven pom,它是上述多模塊項目中的子模塊。我正在使用dependency:unpack-dependencies,然後使用內聯groovy腳本在每個wsdl文件上調用deploy:deploy-file。這是一個hackjob,但我想不出一個更好的方式來做到這一點,沒有硬編碼到模塊中的wsdl文件的路徑,並調用部署執行部署:部署文件mojo,導致一個非常詳細POM。

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
     xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <artifactId>rice</artifactId> 
     <groupId>org.kuali.rice</groupId> 
     <version>2.0.0-m7-SNAPSHOT</version> 
    </parent> 
    <artifactId>rice-dist-wsdl</artifactId> 
    <name>Rice WSDL Distributions</name> 
    <packaging>pom</packaging> 

    <properties> 
     <wsdl.location>${project.build.directory}/wsdl</wsdl.location> 
    </properties> 


    <!-- Depends on all API modules and modules that generate or contain wsdls --> 
    <dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-core-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-kew-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-kim-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-krms-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-ksb-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>rice-shareddata-api</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>unpack-wsdls</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack-dependencies</goal> 
         </goals> 
         <configuration> 
          <includes>**\/*.wsdl</includes> 
          <outputDirectory>${project.build.directory}</outputDirectory> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.gmaven</groupId> 
       <artifactId>gmaven-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>deploy</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <source> 
           def repo_url 
           def repo_id 
           if ("${project.version}".endsWith("SNAPSHOT")) { 
            repo_url = "${kuali.repository.snapshot.url}" 
            repo_id = "${kuali.repository.snapshot.id}" 
           } else { 
            repo_url = "${kuali.repository.release.url}" 
            repo_id = "${kuali.repository.release.id}" 
           } 

           def wsdlGroupId = "${project.groupId}.wsdl" 
           new File("${wsdl.location}").eachFile() { file -> 
            serviceName = file.name.split("\\.")[0] 

            log.info("Deploying ${wsdlGroupId}:${serviceName}:wsdl:${project.version} to ${repo_id}") 

            execString = "mvn deploy:deploy-file -Dfile=${file} -Durl=${repo_url} -DrepositoryId=${repo_id} " 
            execString += "-DgroupId=${wsdlGroupId} -DartifactId=${serviceName} " 
            execString += "-Dversion=${project.version} -Dpackaging=wsdl -Dclassifier=wsdl" 

            def proc = execString.execute() 
            proc.waitFor() 

            err = proc.err.text 
            if (err != null &amp;&amp; err.length() > 0) { 
             log.error(err) 
             fail("Deployment failed for ${wsdlGroupId}:${serviceName}:wsdl:${project.version} to ${repo_id}. \n Run in verbose mode for full error.") 
            } else { 
             log.info("Successfully deployed ${wsdlGroupId}:${serviceName}:wsdl:${project.version} to ${repo_id}") 
            } 
           } 
          </source> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

我非常喜歡這個。我需要做類似的事情。 –

回答

2

另一種可能性:Maven Ant任務可能deploy files。我從來沒有使用它,但我敢打賭你可以使用antrun配置和一些螞蟻模式匹配來獲取和部署所有的WSDL。

+1

我最終做了類似的事情,但通過插入一個腳本循環wsdl文件名,並在每個文件名上調用mvn deploy:deploy-file,使用GMaven(groovy的maven插件)。感謝您的回答,並讓我想到這一點。 – whaley

2

Build Helper插件可能會幫助你。您可以使其發佈WSDL,但必須明確列出每個WSDL,並且它們的名稱中都會包含您的pom的artifactId。只有分類器才能更改。例如:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
      <id>attach-WSDLs</id> 
      <phase>package</phase> 
      <goals> 
       <goal>attach-artifact</goal> 
      </goals> 
      <configuration> 
       <artifacts> 
        <artifact> 
         <file>${project.build.directory}/foo.wsdl</file> 
         <classifier>foo</classifier> 
         <type>wsdl</type> 
        </artifact> 
        <artifact> 
         <file>${project.build.directory}/bar.wsdl</file> 
         <classifier>bar</classifier> 
         <type>wsdl</type> 
        </artifact> 
       </artifacts> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

如果你的POM的座標是myGroupId:myArtifactId:1.1.1,然後安裝了此配置部署將被命名爲myArtifactId-1.1.1-foo.wsdl和myArtifactId-1.1.1文物-bar.wsdl。這是我所知道的最好的。

+1

我可以做到這一點...但我正在處理的潛在可變數量的.wsdl文件,其名稱我可能不知道提前。 – whaley