2011-07-15 11 views
6

Krótkie omówienie mojej sytuacji - pracuję nad bazą kodu, która ma przypisane interfejsy/klasy JAX-WS że generujemy pierwsze kodowe pliki wsdls. Używamy wtyczki CXF cxf-java2ws do generowania skryptów wsdls w czasie kompilacji w programie forven w celu włączenia w .jar dla każdego modułu.

Co chcielibyśmy zrobić to wdrożyć te WSDL plików do repozytorium maven od repozytorium Maven może działać jako

  • prowizoryczny repozytorium usług (takich jak opisane here)
  • dać klientom łatwy sposób na wykorzystanie cxf codegen plugin wskazując na Maven współrzędne WSDL zamiast zarządzania WSDL same pliki

Co mam tak daleko jest plik POM, który wykorzystuje zależność: rozpakować-zależności dostać wszystko z plików wsdl w projekcie do jednego katalogu w ramach tego modułu $ {project.build.directory} (powszechnie znany jako target/do wszystkich tam obecnych).

Nie wiem, jak to zrobić, aby przejrzeć każdy z tych plików i wywołać deploy:deploy-file mojo na każdym kodzie wsdl. Jakie są moje opcje, ponieważ naprawdę chcę zautomatyzować proces wdrażania tych plików wsdl i czy nikt nie wdroży ich ręcznie?

Dla dobra kompletności, tutaj jest plik 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> 

które wbija się WSDLs w docelowym/WSDL (są one zawarte w WSDL/wewnątrz każdego .jar czym zależało):

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

Rozwiązanie

Myśl wha t Zaimplementowałem różni się od zaakceptowanej odpowiedzi dostarczonej przez Ryana Stewarda, przyjąłem jego odpowiedź, ponieważ doprowadziło mnie to do napisania własnego.

Zasadniczo oto maven pom, który jest modułem częściowym w omawianym wyżej projekcie wielomodułowym. Używam zależności: unpack-dependencies, a następnie za pomocą in-line groovy skrypt wywoływania deploy: deploy-file na każdym z tych plików wsdl. To trochę hackjob, ale nie mogłem wymyślić lepszego sposobu, aby to zrobić bez ścieżek hardcoding do plików wsdl w module i wywoływania kilku wykonań depojtu: wdanie-plik mojo na nich, prowadząc do bardzo verbose 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

Bardzo to lubię. Muszę zrobić coś podobnego. –

Odpowiedz

2

Inna możliwość: zadania Maven Ant mogą deploy files. Nigdy go nie używałem, ale założę się, że możesz użyć konfiguracji Antrun i niektórych dopasowań wzorców mrówek, aby podnieść i wdrożyć wszystkie WSDL.

+1

W końcu zrobiłem coś podobnego, ale z GMaven (groove groove) za pomocą wbudowanego skryptu, który zapętla nazwy plików wsdl i wywołuje 'mvn deploy: deploy-file na każdym z nich. Dziękuję za odpowiedź i zmuszenie mnie do tego. – whaley

2

Wtyczka Build Helper może ci pomóc. Możesz sprawić, że opublikuje WSDL, ale będziesz musiał wyszczególnić każdy z nich jawnie, a wszystkie będą miały identyfikator artefaktu twojego pom w ich nazwach. Tylko klasyfikator może się zmienić. Na przykład:

<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> 

Jeśli pom układzie współrzędnych jest myGroupId: myArtifactId: 1.1.1, wówczas artefakty zainstalowany i wdrożony za pomocą tego config będzie nazwany myArtifactId-1.1.1-foo.wsdl i myArtifactId-1.1.1 -bar.wsdl. To najlepsze, co znam.

+1

Mogę to zrobić ... ale mam do czynienia z potencjalnie zmienną liczbą plików .wsdl, których nazwy mogą nie wiedzieć z wyprzedzeniem. – whaley