Für das visualDependencies-Projekt stand ich eben vor dem Problem, dass zur Laufzeit ein Oracle-JDBC-Treiber benötigt wird. Leider kann man ihn jedoch nicht als Abhängigkeit konfigurieren, da zum einen das Projekt unter der GPL läuft, und zum anderen es überhaupt keinen offiziellen Weg dafür gibt. Für den eigenen Buildprozess kann man selbstverständlich ein lokales Repository nutzen, das Artefakt lokal deployen bzw. den Buildserver entsprechend konfigurieren.

Da jedoch das Projekt im Form des Sourcecodes “für alle” erreichbar sein soll, fallen diese Optionen zumindest für diese Situationen weg. Es muss also eine Möglichkeit geben, den OJDBC-Treiber nachträglich in das fertige Applikations-Jar zu integrieren. Und ja, das ist eigentlich sehr trivial.

Im folgenden Ant-Script werden sowohl die Applikations-Jar (visualDependencies.one-jar.jar) als auch der JDBC-Treiber (ojdbc14.jar) in der Konfiguration vorbelegt. Selbstverständlich kann man alle Properties überschreiben bzw. das Script entsprechend anpassen.

Die wichtigen Teile sind: Das Ant-Jar-Command muss den Zusatz “update” erhalten, denn die Ziel-Jar soll nicht ersetzt werden. Außerdem muss ein Fileset mit einer Verzeichnisstruktur angegeben werden, da die Treiber-Jar innerhalb der Ziel-Jar im Verzeichnis lib liegen muss (Struktur einer One-Jar). Das war’s.

Hinweis: Das Ant-File ist für den Gebrauch in einer Maven-Umgebung konfiguriert (basedir=../../../ entspricht dem Root-Verzeichnis bei der Annahme, dass Script unter src/main/scripts/ liegt).

<?xml version="1.0" encoding="UTF-8"?>
<project name="visualDependencies" default="help" basedir="../../../">
    
    <!-- The path of the actual artifact (project name), without the file suffix. -->
    <property name="project.name" value="visualDependencies.one-jar" />
    <!-- The path of the ojdbc driver, without the file suffix. -->
    <property name="ojdbc.name" value="ojdbc14" />
    
    <!-- DO NOT CHANGE THIS LINES UNLESS YOU KNOW WHAT YOU DO! -->
    <property name="project.jar" value="${project.name}.jar" />
    <property name="ojdbc.jar" value="${ojdbc.name}.jar" />

    <!-- Set actual paths of artifacts. -->
    <property name="application.path" location="${basedir}/target/${project.jar}" />
    <property name="ojdbc.parent.path" location="${basedir}/oracle" />
    <property name="ojdbc.path" location="${ojdbc.parent.path}/lib/${ojdbc.jar}" />

    <!-- Shows help (default target) -->
    <target name="help">
        <echo message="See http://www.knallisworld.de/blog/2010/11/23/eine-jar-ojdbc-nachtraglich-in-die-ziel-jar-integrieren/" />
        <echo message="Usage: attachOJDBC" />
    </target>

    <!-- Checks if the artifacts are available. Throws exceptions if they not exist. -->
    <target name="checkDependencies">
        <available file="${application.path}" property="application.exists" />
        <available file="${ojdbc.path}" property="ojdbc.exists" />

        <fail unless="application.exists" message="The application file (${application.path}) does not exist." />
        <fail unless="ojdbc.exists" message="The ojdbc file (${ojdbc.path}) does not exist." />
    </target>

    <!-- Integrates all files of ojdbc.parent.path into the target jar. -->
    <target name="attachOJDBC" depends="checkDependencies">
        <jar update="true" destfile="${application.path}">
            <fileset dir="${ojdbc.parent.path}" />
        </jar>
    </target>

</project>