2007/09/27

Umwandlung eines Ant Path in ein Attribute

Ich stand schon öfters vor dem Problem, das ich eine per "path" deklarierte Dateimenge in eine Liste umwandeln mußte, z.B. um alle Libs in das Class-Path Element der Manifest-Datei zu schreiben. Aus Zeitmangel hatte ich mir bisher leider immer für die händische Variante entschieden, dabei ist die Lösung so einfach.

Definieren eines Path:

<!-- Classpath declaration -->
<path id="project.classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
<include name="**/*.zip"/>
</fileset>
</path>

Dieser kann nun per Task "pathconvert" in die Property "lib.project.manifest.classpath" Umgewandelt werden:
    <!-- convert the libraries to be included in the  Class-Path
attribute of the MANIFEST.MF file -->
<pathconvert property="lib.project.manifest.classpath"
pathsep=" ">
<path refid="project.classpath"/>
<flattenmapper/>
</pathconvert>


Die Einbindung in das Manifest ist dann einfach:
    <target name="build-jar" depends="compile,copymetafiles">
<jar destfile="${build.dir}/intel.jar" basedir="${build.dir}">
<manifest>
<attribute name="Main-Class"
value="org.me.startmeup"/>
<attribute name="Class-Path"
value="${lib.project.manifest.classpath}"/>
</manifest>
</jar>
</target>


Warum ich das nicht schon eher gefunden hab? Keine Ahnung, schließlich ist "pathconvert" direkt unter den Core Tasks unter ant.apache.org gelistet.

2007/09/20

Hibernate mit MySQL und UTF8

Bin dabei mich in JPA (mit Hibernate) einzuarbeiten. Als kleine Beispielanwendung parse ich dazu eine Webseite und speichere Teile davon in einer MySQL Datenbank. Soweit so gut, das Buch 'Java Persistence with Hibernate' hat mir sehr beim Verständnis geholfen.

Ein Problem, das sich Auftat betraf das Speichern von UTF8 Daten in der MySQL Datenbank mittels Hibernate.

Geholfen haben letztlich die folgenden Schritte:

1. Anlegen der DB mit UTF8 Zeichensatz:

mysql> create database mydb charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)


2. Erweitern der JDBC URL in der persistence.xml:
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost/aeintel13b?useUnicode=true&amp;characterEncoding=utf8" />


Testweise (hier auf diesem Laptop) hatte ich eigentlich mit Oracle 10g arbeiten wollen, aber leider ist es mir hier nicht gelungen, UTF8 in die DB zu bekommen. Dazu muss wohl die ganze DB mit UTF8 Support angelegt werden. Da allerdings schon einiges an Daten enthalten ist (in anderen Shemas) war das nicht wirklich eine Option.

2007/08/21

Setzen des Programm-Names für Oracle JDBC Verbindungen

Oracle (und sicher auch andere DBMS) bieten die Möglichkeit, für Sessions einen Programm-Namen zu hinterlegen. Dies ist insbesondere beim Debugging hilfreich. Oder um den Schuldigen zu finden, der eine Verbindung nicht wieder ordentlich geschlossen hat. Die JDBC API scheint hierfür keine Möglichkeit zu kennen, man muss den entsprechenden Parameter daher in einer Properties ablegen und beim Erzeugen der Connection mitgeben:


public static void main(String[] args) throws SQLException {

Properties connectionProps = new Properties();
connectionProps.put("v$session.program", "ProgrammName" );
connectionProps.put("user", "scott");
connectionProps.put("password", "tiger");
Connection con = null;

try {
Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
DriverManager.registerDriver((Driver) driverClass.newInstance());
con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:devel", connectionProps);

// ...

} catch (Exception e) {

e.printStackTrace();
} finally {
if(null != con) {
con.close();
}
}
}
Ein Select auf die v$session sollte jetzt solange die Connection offen einen Eintrag mit 'ProgrammName' liefern.

Das ist natürlich auch nur geklaut ;)

2007/08/16

Subversion checkout von Ant

Um von Ant aus auf Quellen im Subversion zuzugreifen existieren eine Reihe von Möglichkeiten, eine Suche bei Google spült zuerst Refenzen auf:

an Land, sicherlich noch ein paar mehr. Ich fand, das die entweder tot sind oder elendig umständlich in der Einrichtung. So brauchen sie in der Regel den Subversion Client installiert, obstruse javahl Installierungen oder andere Schweinereien.. Da ich auf der fraglichen Maschine keine root Rechte habe und auch nicht vor dem Support auf den Knien rutschen wollte, kam das alles nicht in Frage. Nach einer kurzen Periode in der ich einfach wget von Ant aus gerufen hab (geht, aber ist nun wirklich nicht elegant) bin ich dann glücklicherweise auf Svn4Ant gestoßen.

Installation ist super einfach, nur die nötigen jars (AntX_tasks.jar, JWare_apis.jar, svn4ant.jar) in das Ant-Lib Verzeichniss legen. Zusätlich wird noch die svnkit.jar aus dem SVNKit Projekt benötigt, und schon kann es losgehen.

Noch eine Taskdef:

<taskdef name="svncheckout" classname="com.idaremedia.svn4ant.client.solo.SvnCheckoutTask"/>
anlegen und man kann per

<svncheckout from="${reposURL}" to="${checkout.dir}"/>
die aktuellen Quellen auschecken.

Warum nur hab ich das nicht gleich gefunden?

2007/04/20

Starten von OpenOffice unter Debian als Dienst

In Projekten verwende ich öfters OpenOffice (OO) um aus einer Anwendung heraus Office (und PDF) Dokumente zu erzeugen. OO bietet hierfür die Möglich, über das Netz per UNO ferngesteuert zu werden.

Persönlich finde ich die UNO API zwar, hmm, gewöhnungbedürftig, aber man kann sein Ziel erreichen. Leider läßt sich OO nicht so ohne weiteres als Serverdienst starten. Unter Windows kann man mit srvany zwar recht einfach eine OO Installation in einen Dienst verwandeln, unter Linux (im aktuellen Fall handelte es sich um Debian und Ubuntu) stellte es sich leider etwas umständlich dar.

Auf [1] ist zwar eine Anleitung und auch ein Initscript auf der Basis von start-stop-daemon, leider lief da bei mir nicht out of the Box.

[1] http://www.dokeos.com/wiki/index.php/MakeOOOListening

Zum einen war der erzeugte start-stop-daemon Aufruf falsch (Xvfb) beschwerte sich über Parameter, zum anderen setzt das start-stop-daemon die Umgebungsvariable HOME nicht auf das Homeverzeichniss des per -chuid übergebenen users. Bemerkbar macht sich das in der vielsagenden Fehlermeldung:


[Java framework] Error in function createUserSettingsDocument (elements.cxx).javaldx failed!
[Java framework] Error in function createUserSettingsDocument (elements.cxx).


Ein Eintrag auf [2] brachte mich dann auf die Spur.

[2] http://linuxwiki.de/OpenOffice.org

Letzlich läuft OO jetzt als Dienst von /etc/init.d/ aus, auch wenn ich noch nicht recht glücklich bin. Sobald ich das Script etwas robuster hab, werd ich es hier bereitstellen.