Frage

Ich arbeite an einem kleinen Java -Projekt, das jetzt eine Verbindung zu einer MS SQL Server 2000 -Datenbank herstellt, aber in Kürze eine Verbindung zur MS SQL Server 2005 -Datenbank herstellt. Ich erstelle ein einzelnes Glas, um eine einfache Bereitstellung zu erhalten. Ich habe versucht, es einzurichten, damit ich einfach eine Konfigurationsdatei ändern und Treiber ändern konnte (wie ich es in .NET tun würde). Aufgrund der Einschränkungen von Java's Jar eingebetteter Klassenpfad, und das Fehlen des Wildcard -Charakters auf dem eingebetteten Klassenpfad (1). Gibt es eine Möglichkeit, dieses Problem zu umgehen, ohne auf jeden Fahrerausglas ausdrücklich zu verweisen? Wenn ich das tun muss, muss ich jedes Mal neu kompilieren, wenn sich die Datenbank ändert ...

(1): Klassenpfad-Wildcards werden jedoch im Klassenpfad-Jar-Manifest-Header nicht geehrt.

War es hilfreich?

Lösung

Im Allgemeinen können Sie die ändern Klassenpfad zur Laufzeit. Ansätze wie diese sind die allgemeine Möglichkeit, mit Gläern vom Typ "Plugin" in Java umzugehen (sehr ähnliche Anforderungen wie in Ihrem Fall).

Andere Tipps

Sie können die Informationen darüber, welchen Treiber in einer Konfigurationsdatei verwendet werden sollen, einfügen. Oder im Manifest der JAR -Datei selbst. Fügen Sie einfach alle JAR -Dateien beim Starten Ihrer Anwendung hinzu, laden Sie jedoch den Namen des Fahrers aus der Konfiguration.

Ich würde sagen, dass es nicht der Java -Weg ist (wie in der Standardpraxis), Code von Drittanbietern in das gleiche Glas aufzunehmen, wie Sie bereitstellen. Ein Glas ist jedoch nur eine ZIP -Datei, daher können Sie sie in den meisten Fällen (mit Ausnahme einiger ausgefallener Dinge in den Manifesten) kombinieren, wenn Sie dies benötigen.

Davon abgesehen können Sie in Ihre JAR -Datei einen ClassPath -Verweis auf alle potenziellen JDBC -Treiber -Gläser einbeziehen oder einfach den JDBC -Treiber Jar richtig aufrufen. Nehmen Sie anschließend eine Konfigurationsdatei im selben Verzeichnis (achten Sie darauf, dass Sie in den Klassenpfad Ihres Jars enthalten sind) und lesen Sie dann den Treibernamen davon und verwenden Sie Class.forname (), um den Treiber zu laden.

Sie können schickere Dinge tun (wie das richtige Glas zur Laufzeit zu finden und es dynamisch zu laden, obwohl es nicht auf dem Klassenpfad war), aber diese Dinge sind etwas kompliziert, so dass etwas Einfaches wie das oben genannte funktionieren sollte.

Sie sollten niemals neu kompilieren müssen. Sie machen JDBC nicht wirklich richtig, wenn Sie erneut kompilieren müssen, wenn Sie die Fahrer wechseln.

Sie müssen die Treiber -JAR -Datei und den tatsächlichen Namen des JDBC -Treibers für den jeweiligen Anbieter trennen.

Ich würde wirklich ermutigen, JDBC -Fahrergläser in Ihr eigenes Glas nicht aufzunehmen. Nur um sie zur Laufzeit auf den Weg. In ähnlicher Weise können Sie den Namen des JDBC -Treibermanagers während der Laufzeit oder sogar einer Konfigurationsdatei von den Systemeigenschaften erhalten.

So laufen Sie so aus:

java -jar myapp.jar -cp sqlserver.jar -DdriverManager=com.microsoft.sqlserver.jdbc.SQLServerDriver -DdbUrl=jdbc:some:url

Und in Ihrer Bewerbung machen Sie so etwas (ich lasse die Ausnahmeregelung aus):

Class.forName(System.getProperty("driverManager"));
Connection conn = DriverManager.getConnection(System.getProperty("dbUrl"))

;

Auf diese Weise können Sie die Treiber einfach ändern, indem Sie dem Klassenpfad eine geeignete JAR -Datei hinzufügen und die Eigenschaften von TriverManager und DBURL ändern. Auf diese Weise müssen Sie nicht neu kompilieren, um neue Treiber zu unterstützen.

Das ist die einfachste Lösung, an die ich denken kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top