Java >> Java tutorial >  >> Tag >> static

Implementering af statisk og dynamisk indhold med Maven Wagon Plugin

Et almindeligt præstationskrav for store websteder er, at forskellige domænenavne skal bruges til at levere statisk og dynamisk indhold. Årsagen til dette krav er, at browsere normalt ikke downloader mere end to komponenter parallelt pr. domænenavn på grund af HTTP 1.1-specifikationen. Således bruges adskillelse af statisk og dynamisk indhold under forskellige værtsnavne til at maksimere antallet af parallelle downloads. Flere oplysninger om ydeevneforøgelsen opnået ved brugen af ​​denne teknik er givet på Yahoo! Brugergrænsefladeblog, som indeholder et indlæg med titlen Performance Research, Part 4:Maximizing Parallel Downloads in the Carpoon Line.

For nylig begyndte jeg at spekulere på, hvordan dette krav kan implementeres ved at bruge Maven. Kravene til den Maven-baserede løsning er følgende:

  1. Statisk indhold af Maven-projektet skal automatisk kopieres til serveren, der bruges til at servere statisk indhold.
  2. Det skal være muligt at kopiere CSS-filer og layoutbilleder til forskellige eksterne mapper.
  3. Oprettet krigsfil skal automatisk kopieres til den server, der bruges til at levere dynamisk indhold.
  4. Filer skal kopieres ved hjælp af FTP-protokol.

Da jeg forskede lidt, lærte jeg, at Maven Wagon-plugin kan bruges til at opfylde de givne krav.

Påkrævede trin

De nødvendige trin for at opfylde de givne krav er følgende:

  • Aktivering af FTP-understøttelse af Maven Wagon Plugin
  • Konfiguration af de brugte legitimationsoplysninger
  • Konfiguration af Maven Wagon Plugin

Hvert af disse trin er beskrevet med flere detaljer i det følgende.

Aktivering af FTP-understøttelse af Maven Wagon Plugin

Men da det ikke understøtter FTP-protokol ud af æsken, forsøgte jeg først at aktivere FTP-understøttelse ved at følge instruktionerne givet på brugssiden på plugin-hjemmesiden. Jeg bemærkede hurtigt, at denne tilgang ikke virker, fordi udvidelsen, der tilføjer FTP-understøttelse til Maven Wagon, ikke var kompatibel med commons-net-1.4.1.jar. Så i stedet for at følge instruktionerne på plugin's hjemmeside, kopier følgende jar-filer til din $MAVEN_HOME/lib mappe:

  • wagon-ftp-beta-6.jar
  • oro-2.0.8.jar
  • commons-net-2.0.jar

Konfiguration af de brugte legitimationsoplysninger

Før vi undersøger den konfiguration, der er tilføjet til pom.xml-filen, skal vi konfigurere legitimationsoplysningerne for de brugte servere til filen settings.xml. Jeg anbefaler at konfigurere legitimationsoplysningerne ved at bruge brugerspecifik indstillingsfil (standardplaceringen af ​​denne fil er ~/.m2/settings.xml ). Følgende eksempel indeholder egne legitimationsoplysninger for CSS-filer, layoutbilleder og krigsfilen (Husk at erstatte brugernavne og adgangskoder med korrekte):

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>css</id>
      <username>cssUser</username>
      <password>cssPassword</password>
      <!-- If you want deploy to active FTP server, uncomment the following block -->
      <!-- 
       <configuration>
         <passiveMode>false</passiveMode>
       </configuration>
       -->
    </server>
    <server>
      <id>images</id>
      <username>imagesUser</username>
      <password>imagesPassword</password>
      <!-- If you want deploy to active FTP server, uncomment the following block -->
      <!-- 
       <configuration>
         <passiveMode>false</passiveMode>
       </configuration>
       -->
    </server>
    <server>
      <id>war</id>
      <username>warUser</username>
      <password>warPassword</password>
      <!-- If you want deploy to active FTP server, uncomment the following block -->
      <!-- 
       <configuration>
         <passiveMode>false</passiveMode>
       </configuration>
       -->
    </server>
  </servers>
</settings>

Konfiguration af Maven Wagon Plugin

Nu hvor vi har opfyldt alle forudsætningerne for brugen af ​​FTP via Maven Wagon plugin, kan vi tage et kig på pom-filen, som får magien til at ske. Da pom.xml er ret stort, vil jeg forklare det i mindre stykker, hvilket skulle gøre det lettere at forstå. Først vil vi koncentrere os om plugin-erklæringen for Maven Wagon-plugin:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>wagon-maven-plugin</artifactId>
  <version>1.0-beta-3</version>
  <!--
    Contains unique execution declarations for CSS files,
    layout images and war file.
   -->
  <executions>
    <!--
      Declaration for copying CSS files via FTP
     -->
    <execution>
      <id>upload-css</id>
      <!--
        Describes the lifecycle phase when the plugin's
        goals are being executed.
       -->
      <phase>install</phase>
      <!--
        Describes the goals are executed in the specified
        lifecycle phase.
       -->
      <goals>
        <goal>upload</goal>
      </goals>
      <configuration>
        <!--
          Describes the local directory, which contents are 
          copied.
         -->
        <fromDir>${css.local.dir}</fromDir>
        <!--
          Describes the included files.
         -->
        <includes>*</includes>
        <!--
          Describes the url of the remote FTP server.
         -->
        <url>${css.remote.url}</url>
        <!--
          Describes the remote directory, where the contents 
          of the local directory are copied.
         -->
        <toDir>${css.remote.dir}</toDir>
        <!--
          Describes the server id, which is used to fetch the
          used credentials from settings.xml.
         -->
        <serverId>${css.remote.server.id}</serverId>
      </configuration>
    </execution>
    <!--
      Declaration for copying images via FTP. See the declaration
      of CSS files for more information about the configuration.
     -->
    <execution>
      <id>upload-images</id>
      <phase>install</phase>
      <goals>
        <goal>upload</goal>
      </goals>
      <configuration>
        <fromDir>${images.local.dir}</fromDir>
        <includes>*</includes>
        <url>${images.remote.url}</url>
        <toDir>${images.remote.dir}</toDir>
        <serverId>${images.remote.server.id}</serverId>
      </configuration>
    </execution>
    <!--
      Declaration for copying war file via FTP. See the 
      declaration of CSS for more information about the
      configuration.
     -->
    <execution>
      <id>upload-war</id>
      <phase>install</phase>
      <goals>
        <goal>upload</goal>
      </goals>
      <configuration>
        <fromDir>${war.local.dir}</fromDir>
        <includes>*</includes>
        <url>${war.remote.url}</url>
        <toDir>${war.remote.dir}</toDir>
        <serverId>${war.remote.server.id}</serverId>
      </configuration>
    </execution>
  <executions>
</plugin>

Fedt nok. Vi har nu konfigureret Maven Wagon-plugin'et til at kopiere CSS-filer, billeder og krigsfiler til fjern FTP-server, når installationens livscyklusfase udføres. Det er klart, at vi nu også skal konfigurere Maven War-pluginet til at udelukke CSS-filer og billeder fra krigsfilen. Dette kan gøres ved at bruge følgende plugin-erklæring:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.0.2</version>
  <configuration>
    <!--
      Excludes the contents of the styles and image  directories when copying 
      files to the directory used to create war file. Note that the directories
      are hard coded and you might have to change the configuration
      depending on your project structure.
     -->
    <warSourceExcludes>
      styles/*, images/*
    </warSourceExcludes>
  </configuration>
</plugin>

Den sidste interessante del af pom-filen indeholder de egenskabserklæringer, der bruges i konfigurationen af ​​Maven Wagon-plugin. Disse erklæringer er vist i følgende:

<properties>
  <!-- Settings for CSS files -->
  <css.local.dir>${basedir}/src/main/webapp/styles</css.local.dir>
  <!-- Insert the remote target directory path for CSS files -->
  <css.remote.dir></css.remote.dir>
  <css.remote.server.id>css</css.remote.server.id>
  <!-- Insert the url address of the FTP server for CSS files -->
  <css.remote.url></css.remote.url>

  <!-- Settings for image files -->
  <images.local.dir>${basedir}/src/main/webapp/images</images.local.dir>
  <!-- Insert the remote target directory path for images -->
  <images.remote.dir></images.remote.dir>
  <images.remote.server.id>images</images.remote.server.id>
  <!-- Insert the url address of the FTP server for image files -->
  <images.remote.url></images.remote.url>

  <!-- Settings for War files-->
  <war.local.dir>${basedir}/target</war.local.dir>
  <!-- Insert the remote target directory path for war file -->
  <war.remote.dir></war.remote.dir>
  <war.remote.server.id>war</war.remote.server.id>
  <!-- Insert the url address of FTP server for war file -->
  <war.remote.url></war.remote.url>
</properties>

Implementeringsprocessen kan udløses ved at udføre kommandoen:mvn install i projektets rodmappe (Mappen, som indeholder pom.xml-filen). Resultatet er følgende:

  1. CSS-filer kopieres fra det konfigurerede lokale bibliotek til det angivne fjernbibliotek.
  2. Billeder kopieres fra det konfigurerede lokale bibliotek til det angivne fjernbibliotek.
  3. War-filen er konstrueret og kopieret fra den konfigurerede lokale mappe til den angivne fjernmappe.

Afsluttende ord

Det skulle nu være klart, hvordan Maven Wagon-plugin'et kan bruges til at kopiere statiske og dynamiske filer til forskellige værter. Den nuværende konfiguration er dog langt fra perfekt. For at være ærlig er den ikke klar til produktionsbrug. Forskellige Maven-profiler til udvikling, test og produktionsbrug bør tilføjes, før jeg vil anbefale brugen af ​​denne konfiguration i seriøs udvikling. Masterplanen bag dette er følgende:

På dette tidspunkt er den eneste måde at køre eksempelprojektet fra en fungerende krigsfil (stilarter og billeder er inkluderet i krigsfilen), at kommentere konfigurationsafsnittet i Maven War plugin-erklæringen. Manglen på profiler er også grunden til at forklare, hvorfor uploadmålet for Maven Wagon-pluginet udløses af installationens livscyklusfase. Ved brug af forskellige profiler kunne Maven konfigureres på en sådan måde, at ingen filer kopieres til fjernservere og udelukkes fra krigsfilen, når udviklingsprofilen er aktiveret. Adskillelse af test- og produktionsprofiler ville også gøre det muligt at kopiere filer til forskellige fjernservere afhængigt af den aktiverede profil. Dette vil naturligvis også give os mulighed for at bestemme de url-adresser, som er nødvendige for at få adgang til statisk indhold, baseret på den anvendte profil.

Under alle omstændigheder efterlades denne forbedring som en øvelse for læseren.

Ansvarsfraskrivelse: Eksempelprojektet er testet med JDK 1.6.0_20, Maven 2.2.0 og OS X 10.6.4. Gennemse kildekoden til eksempelprojektet.


No
Java tag