Web Service Release- / Versionsinformation (ANT)

Buildinformationen über JavaSOAP oder REST Web Service definieren immer eine Schnittstelle zu einem bestimmten Softwaresystem. Jedoch kann sich die Implementierung hinter dieser Schnittstelle jederzeit ändern. Mithilfe einer einzelnen Methode sollte man stets die aktuelle Version der Implementierung einsehen können. In diesem Beitrag zeige ich, wie so eine Methode aussehen kann und was sie beinhalten sollte.

 

Das Konzept

Wie bereits geschrieben, geht es um den Versionsstand der Implementierung eines Web Services. Hierbei gibt es ein großes Problem: Wer macht das für uns?
Die Antwort auf diese Frage lautet: “ICH – dein Buildsystem!!!”. Je nach Buildsystem(ANT, Maven, etc.) gibt es diverse Möglichkeiten Informationen über einen Build abzuspeichern. Diese Informationen können z.B. in einer Methode des Web Services ausgelesen und dem Client gesendet werden. Da ich sehr gerne ANT verwende, zeige ich hier ein kleines Beispiel:

Wer keine Ahnung von ANT hat: kurze Einführung in das Java-Buildsystem ANT von Vogella….

 

neues Buildtarget (Windows XP)

Das folgende Build-Target, namens “releaseinfo“, sammelt diese Informationen:

  • Zeile 10: Buildnummer – Konstante (automatisch gefüllt)
  • Zeile 17: Projektname – Variable (muss selbstständig gefüllt werden)
  • Zeile 18: ANT Version – Konstante (automatisch gefüllt)
  • Zeile 19: Builddatum – Konstante (automatisch gefüllt)
  • Zeile 20: Java Version – Konstante (automatisch gefüllt)
  • Zeile 23: User – Variable (hängt vom Betriebssystem ab und wird ggf. automatisch gefüllt)
  • Zeile 24: PC Name – Variable (hängt vom Betriebssystem ab und wird ggf. automatisch gefüllt)
  • Zeile 25: Stammverzeichnis – Konstante (automatisch gefüllt)

… und speichert sie in eine Datei (releaseInfo.properties). ACHTUNG – der Dateiname und Pfad wurde vorab in der Build.xml oben definiert (Siehe “gesamte Build.xml“).

	<target name="releaseinfo">
		<!-- Buildnummer von ANT verwenden -->
		<buildnumber file="${generated.releaseinfo}" />

		<!-- Umgebungsvariable auslesen-->
		<property environment="env" />


		<propertyfile file="${generated.releaseinfo}" comment="This file is automatically generated - DO NOT EDIT">
			<entry key="projektname" value="${ant.project.name}" />
			<entry key="antver" value="${ant.version}" />
			<entry key="builddate" type="date" pattern="dd.MM.yyyy HH:mm:ss" value="now"/>
			<entry key="javaver" value="${ant.java.version}" />
			 <!-- Umgebungsvariable auslesen (auf Gross-/Kleinschreibung achten!) -->
			 <!-- Koennen je nach Betriebssystem variieren (XP-Variante)  -->
			<entry key="user" value="${env.USERNAME}" />
			<entry key="pcname" value="${env.COMPUTERNAME}" />
			<entry key="basedir" value="${basedir}" />			
		</propertyfile>
		
		<copy todir="${classes.dir}">
			<fileset file="${generated.releaseinfo}" />
		</copy>

	</target>

gesamte Build.xml

<project name="RechteckWebService" default="release" basedir=".">
	<property name="jaxws-version" value="2.0" />
	<property name="jar.file" value="${ant.project.name}.jar" />
	<property name="generated" value="generated" />
	<property name="generated.src"         value="${generated}/src" />
	<property name="generated.wsdl"        value="${generated}/wsdl" />
	<property name="generated.releaseinfo" value="${generated.src}/releaseInfo.properties" />
	<property name="generated.manifest"    value="${generated.src}/Manifest.mf" />
	<property name="classes.dir" value="bin" />
	<property name="wsgen.exec" value="C:/Programme/Java/jdk1.6.0_27/bin/wsgen" />
	<target name="clean">
		<delete failonerror="false" includeemptydirs="true">
			<fileset dir="${generated.src}" excludes="**/*.properties" />
			<fileset dir="${generated.wsdl}" />
			<fileset dir="release" />
		</delete>
		<mkdir dir="${generated}" />
		<mkdir dir="${generated.src}" />
		<mkdir dir="${generated.wsdl}" />
		<mkdir dir="${generated.src}/info" />
		<mkdir dir="release" />
	</target>

	<target name="release" depends="clean, create-service, releaseinfo, jar" />

	<target name="create-service">
		<antcall target="create-ws">
			<param name="portname" value="{http://www.axxg.de/ws/rechteck}RechteckWebServicePort" />
			<param name="servicename" value="{http://www.axxg.de/ws/rechteck}RechteckWebService" />
			<param name="classname" value="main.RechteckService" />
		</antcall>
	</target>

	<target name="jar">
		<manifest file="${generated.manifest}" mode="update">
			<attribute name="Main-Class" value="server/Server" />
		</manifest>
		
		
		<jar destfile="release/${jar.file}" manifest="${generated.manifest}">
			<zipfileset dir="${classes.dir}" includes="**/*.*" />
		</jar>
	</target>

	<target name="create-ws">
		<exec executable="${wsgen.exec}">
			<arg value="-wsdl" />
			<arg value="-keep" />
			<arg value="-classpath" />
			<arg value="${classes.dir}" />
			<arg value="-r" />
			<arg value="${generated.wsdl}" />
			<arg value="-s" />
			<arg value="${generated.src}" />
			<arg value="-d" />
			<arg value="${classes.dir}" />
			<arg value="-servicename" />
			<arg value="${servicename}" />
			<arg value="-portname" />
			<arg value="${portname}" />
			<arg value="${classname}" />
		</exec>
	</target>

	<target name="releaseinfo">
		
	    <!-- Buildnummer von ANT verwenden -->
		<buildnumber file="${generated.releaseinfo}" />

		<!-- Umgebungsvariable auslesen-->
		<property environment="env" />

		<propertyfile file="${generated.releaseinfo}" comment="This file is automatically generated - DO NOT EDIT">
			<entry key="projektname" value="${ant.project.name}" />
			<entry key="antver" value="${ant.version}" />
			<entry key="builddate" type="date" pattern="dd.MM.yyyy HH:mm:ss" value="now"/>
			<entry key="javaver" value="${ant.java.version}" />
			 <!-- Umgebungsvariable auslesen (auf Gross-/Kleinschreibung achten!) -->
			 <!-- Koennen je nach Betriebssystem variieren  -->
			<entry key="user" value="${env.USERNAME}" />
			<entry key="pcname" value="${env.COMPUTERNAME}" />
			<entry key="basedir" value="${basedir}" />			
		</propertyfile>
		
		<copy todir="${classes.dir}">
			<fileset file="${generated.releaseinfo}" />
		</copy>

	</target>
</project>

 

SOAP Web Service mit ReleaseInfo-Methode

Ab jetzt wird automatisch eine releaseinfo.properties erzeugt, die nur noch in einer Web Service Methode ausgelesen werden muss. Hierbei empfehle ich eine unternehmensweite Konvention aufzustellen, wie zum Beispiel:

Jeder Web Service stellt eine Methode “getReleaseInfo” bereit und diese liefert eine Zeichenkette mit den Daten XY zurück!

Warum habe ich einen StringWriter benutzt?! Die Antwort lautet: “Für jedes Betriebssystem gibt es unterschiedliche “newLine“-Zeichen und der StringWriter abstrahiert diese.”

 


   public  @WebResult(name= "ReleaseInfo")String getReleaseInfo() {
		String retStr = null;
		try {
			StringWriter strWr = new StringWriter();
			PrintWriter printWr = new PrintWriter(strWr);
			
			// von ANT generierte Properties-Datei einlesen
			InputStreamReader inputstrReader = new InputStreamReader(RechteckService.class.getClassLoader().getResourceAsStream("releaseInfo.properties"));
			
			Properties releaseInfoProp = new Properties();
			releaseInfoProp.load(inputstrReader);
			
			printWr.println("Projektname: " + releaseInfoProp.getProperty("projektname"));
			printWr.println("Version: " + releaseInfoProp.getProperty("build.number"));
			printWr.println("Builddatum: " + releaseInfoProp.getProperty("builddate"));
			printWr.println("Buildverzeichnis: " + releaseInfoProp.getProperty("basedir"));
			printWr.println("ANT Version: " + releaseInfoProp.getProperty("antver"));
			printWr.println("Java Version: " + releaseInfoProp.getProperty("javaver"));
			printWr.println("User: " + releaseInfoProp.getProperty("user"));
			printWr.println("Workstation: " + releaseInfoProp.getProperty("pcname"));
			
			printWr.close();
			strWr.close();
			inputstrReader.close();
			
			retStr = strWr.toString();
		} catch(Exception e){
			retStr = "Unerwarteter Fehler beim Lesen der Releaseinfo: " + e.toString();
			//e.printStackTrace();
		}
		return retStr;
   }

 

Beispiel SOAP Request

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getReleaseInfoResponse xmlns:ns2="http://www.axxg.de/ws/rechteck">
         <ReleaseInfo>
Projektname: RechteckWebService
Version: 13
Builddatum: 09.10.2012 11:11:43
Buildverzeichnis: C:\Dokumente und Einstellungen\AxxG\Desktop\RechteckWS
ANT Version: Apache Ant(TM) version 1.8.2 compiled on December 20 2010
Java Version: 1.6
User: Alexander
Workstation: AxxG-PC
</ReleaseInfo>
      </ns2:getReleaseInfoResponse>
   </S:Body>
</S:Envelope>

 

Beispielprojekt

Web Service mit ReleaseInfo

 

Blog-Serie

Dieser Beitrag ist teil meiner Blog-Seriegutes Web Service Design“. In dieser Serie berichte ich über Methoden und Möglichkeiten, um effektiv mit Web Services arbeiten zu können. Weitere Themen sind:

 

Quellen

 

Copyright © 2012 AxxG – Alexander Gräsel



1 Antwort : “Web Service Release- / Versionsinformation (ANT)”

  1. René Hoffmann sagt:

    Sehr schön!

    Du könntest in Deinem Beispiel auch den PrintWriter und die println()-Methode verwenden. Dann wäre der Code noch etwas übersichtlicher.

Kommentar verfassen