Konfiguration von GWT Applikationen über Maven Profile

In meinen GWT Oberflächen greife ich meist auf REST APIs zu, wobei die Basis URL als Konstante im Quelltext hinterlegt ist. Bislang ist das bei mir immer ein statisches Attribut in der Implementierung der Klasse EntryPoint. Alle Klassen, die dann die REST Kommunikation erledigen, greifen auf diese Konstante zu. Etwas aufwändig und fehleranfällig ist dabei das Umschalten zwischen den verschiedenen Servern, die ich für die Entwicklung, den Testbetrieb und das Live-System benutze. Vor jedem Checkin muss die richtige URL definiert werden. Ich habe die drei URLs für die drei Server im Quelltext hinterlegt und kommentiere die richtige URL aus. Wenn man alleine an solchen Projekten arbeitet, ist das Vorgehen auch ganz ok. Jetzt beginne ich aber gerade wieder in Teams zu arbeiten und da hat sich dieses manuelle Umschalten als lästig gezeigt. Also, Automatisierung bitte.

In GWT gibt es einen Mechanismus für das Auslagern von Text-Konstanten in Property Dateien, den ich mir zunutze mache. Ich lege im Package client des GWT Projektes ein Interface an:

1
2
3
4
5
6
import com.google.gwt.i18n.client.Constants;
 
public interface MyConstants extends Constants
{
	String serverUrl( );
}

Im selben Package werden nun für die verschiedenen Server jeweils Property Dateien angelegt:

  • MyConstants.live.properties mit der URL für das Live-System
  • MyConstants.staging.properties mit der URL für das Test-System
  • MyConstants.localhost.properties mit der URL für das Entwicklungssystem

Jede Datei enthält dabei genau eine Zeile:

serverUrl=http://...

Wichtig ist, dass die Methode im Interface und der Key in der Property Datei übereinstimmen. In der Klasse, die beim Start der GWT Applikation geladen wird, muss nun die Property Datei geladen werden. Dazu fügt man zum Beispiel im Konstruktor folgende Zeilen ein:

1
2
MyConstants myConstants = GWT.create( MyConstants.class );
BASEURL = myConstants.serverUrl( );

Das Attribut BASEURL ist in diesem Beispiel das statische Attribut, von dem oben die Rede war. Aber welche Property Datei wird nun geladen, wenn GWT.create aufgerufen wird? Natürlich keine von den drei oben genannten, sondern die Datei MyConstants.properties, die es bislang aber noch nicht gibt. Und jetzt kommt noch Maven ins Spiel.

In der pom.xml hatte ich bereits für die drei Server (localhost, staging und production) jeweils Profile angelegt, damit das Deployen einfach beim Aufruf von Maven zu konfigurieren ist. Jetzt werden die Definitionen der Profile noch ergänzt, und zwar folgendermaßen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<profile>
      <id>tomcat-localhost</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
         <tomcat-server>tomcat-localhost</tomcat-server>
         <tomcat-url>http://localhost:8080/manager/text</tomcat-url>
      </properties>
      <build>
      <plugins>
         <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
               <executions>
                  <execution>
                     <phase>test</phase>
                     <goals>
                        <goal>run</goal>
                     </goals>
                     <configuration>
                        <tasks>
                           <delete file="${project.build.outputDirectory}/de/.../client/MyConstants.properties"/>
                           <copy file="src/de/.../client/MyConstants.localhost.properties"										               
                                 tofile="${project.build.outputDirectory}/de/.../client/MyConstants.properties" />
                        </tasks>
                     </configuration>
                  </execution>
               </executions>
            </plugin>
         </plugins>
      </build>
</profile>

Die Pfade müssen natürlich noch entsprechend angepasst werden. Mit Hilfe von Ant wird hier also die korrekte Property Datei, in diesem Fall die Datei für localhost, unter dem Namen MyConstants.properties verfügbar gemacht. Für jedes der verwendeten Profile muss dieser Kopiervorgang entsprechend in der pom.xml eingefügt werden. Das war’s. Jetzt man man auf der Kommadozeile oder über den Build-Server wie gewohnt mit mvn tomcat:redeploy -P tomcat-localhost unter Angabe des gewünschten Profils deployen und die korrekte URL wird von GWT aus einer Property Datei gelesen.