Problem beim Einbinden externer JAR : JDBC

Ich habe ein neues Bundle erstellt, ähnlich wie InfluxDB und dessen Connector, für Microsoft SQL. Damit es funktioniert, habe ich auch die folgende Abhängigkeit in “cnf” eingebunden:

<dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>9.2.1.jre11</version>
</dependency>

Link

Ich kann sehen, dass OSGi auch die .jar-Datei automatisch heruntergeladen hat. Ich habe den Pfad der jar-Datei in bnd.bnd des neuen Bundles, das ich erstellt hatte, sowie in bnd.bnd von EdgeApp.bndrun aufgenommen. Ich habe auch ein oder zwei Mal versucht, die Bundles aufzulösen. Leider erkennt mein Code immer noch nicht den verbundenen Treiber, wenn ich ihn aktiviere durch Apache Web Console.

Ich wäre wirklich sehr dankbar, wenn mir jemand sagen könnte, wie ich meine Situation lösen könnte, oder mich vielleicht wissen lassen, ob ich einen Schritt verpasst habe.

HINWEIS: Ich habe den Treiber schon einmal als eigenständigen Code getestet, und er funktioniert. Ich bin also zuversichtlich, dass ich den richtigen Treiber ausgewählt habe.

Hallo Laksh,

ohne Code ist es immer schwer das genaue Problem zu finden. Je nachdem ob externe Bibliotheken die notwendigen Einträge in der MANIFEST-Datei haben oder nicht, ist es leicht oder schwer, sie in einem OSGi-Projekt wie OpenEMS zu verwenden. In diesem Fall haben wir aber Glück und es passt alles.

Ich habe einen Branch erstellt, in dem ich die MS-SQL JDBC Bibliothek einbinde und erfolgreich starten kann. Mangels MS-SQL-Server kann ich es aber nicht komplett testen - es sollte trotzdem eine gute Vorlage sein.

Gruß,
Stefan

Hallo Stefan,
Während des letzten Wochenendes habe ich es selbst gelöst. Ich habe vorher nicht ganz verstanden, wie man einen Wrapper für die JAR-Datei macht. Aber später habe ich einen .bnd-Wrapper für meinen JDBC-Treiber erstellt und ihn in die Dienste eingebunden. Jetzt ist er funktionstüchtig.

Danke, dass Sie einen neuen Branch dafür erstellt haben. Ich habe den Treiber nicht so initialisiert, wie Sie es in der Vorlage vorgeschlagen haben. Vielleicht ist es eine einfachere Version!. Ich werde es auch ausprobieren, und werde es mit meiner DB testen.

Obwohl ich die Dinge selbst gelöst habe, würde ich mich trotzdem freuen, meinen Code in diesen Zweig zu schieben. Das wäre auch für alle besser, auch für mich. Ihr Team könnte vielleicht kleinere Probleme beheben, oder auch den Code standardisieren, um ihn im develop-Zweig für andere verfügbar zu machen.

viele Grüße
Laksh

Hallo Laksh,

ein eigener Wrapper ist für diese Bibliothek nicht notwendig, weil sie bereits die notwendigen Header-Informationen für OSGi mitbringt.

Ich würde vorschlagen, dass du vom OpenEMS-Repository auf GitHub einen Fork erstellst und dann meinen Branch als Basis nimmst für deine Entwicklungen. Du kannst dann auch gleichen einen Pull-Request (z. B. im Status “Draft/Entwurf”) erstellen, dann ist es einfacher Feedback zu geben.

Die Backend Metadata.Odoo-Komponente arbeitet übrigens auch mit JDBC für eine Postgres-Datenbank. Vielleicht kann das auch als Vorlage dienen, z. B. für prepared Statements usw.:

Gruß,
Stefan

Hallo Stefan,

ich habe eine funktionierende Funktionalität für die MS-SQL-DB ausgearbeitet, wie von dir vorgeschlagen. Habe auch versucht, den Code zu testen und zum Glück funktioniert es. Ich habe versucht, die Funktionalität ähnlich wie bei InfluxDB mit den Kernelementen Verbindung, Schreiben und Lesen in einer Shared-Datei zu entwickeln: io.openems.shared.mssql. Ich stehe derzeit nur vor einem Problem bei der Verwendung der OpenemsException-Klasse. Ich bin mir nicht sicher, was ich falsch mache. Ich hänge den Screenshot des Codes unten an.

grafik

Zusätzlich habe ich den obigen Codeschnipsel auskommentiert und einen Pull-Request meines Codes wie folgt erstellt:

Pull Request - Timedata - MS SQL - First working draft #1433

Wenn du Zeit hast, lass mich wissen, wie ich weiter gehen soll

viele Grüße
Laksh

Hallo Laksh,

ich habe dir direkt im Pull-Request geantwortet. Dort ist es etwas einfacher “direkt am Code” zu arbeiten.

Gruß,
Stefan