www.alexander-merz.com | Alexander Merz

Jasperreports, PHP und der Java-CLASSPATH

Neulich erhielt ich eine Anfrage über den Einsatz von Jasperreports in PHP. Jasperreports ist ein umfangreiches Reporting-Werkzeug in Java und steht unter der LGPL.

Die Java-Bibliothek erstellt Reports in einer ganzen Reihe von Formaten (z. B. PDF, HTML, RTF), Basis dafür ist eine XML-Datei. Der Aufruf der entsprechenden Java-Klassen in PHP ist relativ trivial. Da sich die Anzahl der Reporting-Tools in PHP in Grenzen hält, sollten man auch als PHP-Programmierer durchaus mal einen Blick drauf werfen: http://jasperreports.sourceforge.net/

Das Beispiel-Javaprogramm unter http://ensode.net/jasperreports_intro.html sieht in der PHP-Form so aus:

<?php
$path = '/MyDir/reports/';

$sJcm = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
$report = $sJcm->compileReport($path."jasperreports_demo.jrxml");

$sJfm = new JavaClass("net.sf.jasperreports.engine.JasperFillManager");
$print = $sJfm->fillReport($report, 
new Java("java.util.HashMap"),
 new Java("net.sf.jasperreports.engine.JREmptyDataSource"));

$sJem = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
$sJem->exportReportToPdfFile($print, $path."simple_report.pdf");
?>
Die einzige Anpassung ist die Verwendung absoluter Pfadangaben.

Soweit so gut. Auf ein Problem bin ich allerdings gestossen, als ich das Skript ausführen wollte. PHP hat die Klassen nämlich nicht gefunden, obwohl ich sie eigentlich in die systemweite Umgebungsvariable CLASSPATH aufgenommen hatte.

Die Rätsels Lösung: Tomcat definiert seine eigene CLASSPATH-Variable, die auch von PHP übernommen wird. Prüfen kann man dass ganz einfach mit einem echo $_ENV['CLASSPATH'];.

Deshalb muss auch diese CLASSPATH-Variable entsprechend angepasst werden. Es gibt mehrere Stellen, an denen das möglich ist, z. B. in setclasspath.bat bzw. .sh im bin-Verzeichnis der Tomcat-Installation.

In der Zeile (Windows)

set CLASSPATH=%JAVA_HOME%\\libtools.jar
bzw. (Linux)
CLASSPATH="$JAVA_HOME"/lib/tools.jar
werden die benötigten Verzeichnisse bzw. Jar-Dateien ergänzt.

In der Windows-Variante könnte dies für Jasperreports so aussehen (eine Zeile!):

set CLASSPATH=%JAVA_HOME%\\libtools.jar;
c:\\tomcat\\webapps\\jasperreport\\WEB-INF\\lib\\jasperreports-1.2.0.jar;
c:\\tomcat\\server\\lib\\commons-digester.jar;
c:\\tomcat\\server\\lib\\commons-collections-3.1.jar;
c:\\tomcat\\server\\lib\\commons-beanutils.jar;
c:\\tomcat\\webapps\\jasperreport\\WEB-INF\\lib\\itext-1.3.jar