DevFaqHowPackageLibraries DE

3rd-Party Bibliotheken und Module

Contributed By; Aljoscha Rittner | Josh


Ursprünglicher Blog-Eintrag: BeanDev: 3rd-Party Bibliotheken und Module

Problemstellung


Trivial ist es nicht, manche Fremdbibliotheken in NetBeans zu integrieren. Insbesondere wenn die Libraries über eigene Classloader oder auch nur den lokalen Kontext-Classloader Klassen nachladen wollen. Hat man nämlich diese Bibliothek in ein Library-Wrapper-Modul gepackt, ist diese gut abgeschottet und könnte nur Klassen aus Modulen laden, zu denen Abhängikeiten definiert wurden.

Nun liegt es aber in der Natur der Sache, dass man ja diese (in ein Modul eingepackte) Bibliothek selber in Abhängigkeit einbinden möchte.

  1. Library Wrapper mit public packages <- nutzt <- Modul XYZ
  2. Modul XYZ mit public packages -> stellt Klassen zur Verfügung -> *
  3. Library Wrapper lädt per Classloader Klassen von Modul XYZ

Spätestens Punkt 3 scheitert, weil der Library-Wrapper sich Modul XYZ nicht in Abhängigkeit setzen kann. Es käme zu einer zyklischen Referenz, die das Build-System von NetBeans nicht auflösen kann.

Solche Probleme bekommt man z.B. mit dem Java Media Framework (Media Registry) oder Xalan (Digester).

Da man diese 3rd-Party-Bibliotheken nicht umprogrammieren kann (damit sie z.B. den System Classloader verwenden), muss man sich etwas anderes einfallen lassen.

Lösung


Zwar unterscheidet NetBeans in seinem "New Project"-Assistenten zwischen Library-Wrapper Module und Module, tatsächlich gibt es keine technische Unterscheidung. Auch ein NetBeans-Modul mit Sourcecode darf Fremdbibliotheken einbinden. Grundsätzlich gibt es auch keine Einschränkung bei der Menge an Fremdbibliotheken (auch wenn es der Assistent des Library-Wrapper Modules suggeriert).

Wenn man in dem eigenen Modul-Projekt die Fremdbibliotheken importiert hat, werden die eigenen Klassen und die Klassen der JAR-Dateien in dem selben Module-Classloader geladen. Außerdem gibt es keine Notwendigkeit zyklische Abhängigkeiten zu deklarieren, weil mit so einem Aufbau schon die Bindung zueinander definiert wurde. Nach außen (aus der Sicht anderer Module) erscheint so ein hybrides Modul aus eigenen Klassen und Fremdklassen als eine Bibliothek mit (i.d.R.) unterschiedlichen Root-Packages.

Was ist also zu tun, um die JAR-Dateien erstmal in dem eigenen Projekt zu aufzunehmen?

Zunächst wechselt man vom Projects-Fenster zum Files-Fenster, damit man dort Ordner auf Projekt-Ebene anlegen kann. Direkt unter dem Projekt-Hauptordner legt man einen Unterordner release an. Allein dieser Ordner sorgt dafür, dass das Build-Script eine Sonderbehandlung für Fremdbiblioteken startet. Wenn dieser Ordner existiert, muss in diesem mindestens der Unterordner modules und darin der Ordner ext existieren (sonst kommt es zu einem Build-Fehler).

Also so sollte es beispielsweise Aussehen:

  • XYZ Module
  • nbproject
  • release
  • modules
    • ext
  • src
  • test

In den ext-Ordner kommen die JAR-Dateien, die benötigt werden.

Das Build-Script kümmert sich nun darum, dass die JAR-Dateien mit dem Projekt in die NBM-Installationsdatei aufgenommen wird.

Es wird aber noch in der project.xml noch eine Classpath-Referenz benötigt:

In der "Projects-Ansicht" unter "Important Files" die "Project Metadata" öffnen und dann unter den Abschnitt:

<project xmlns="http://www.netbeans.org/ns/project/1">
    <type>org.netbeans.modules.apisupport.project</type>
    <configuration>
        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
            <code-name-base>de.example.xyz</code-name-base>

folgende Classpath-Erweiterung angeben:

            <class-path-extension>
                <runtime-relative-path>ext/3rdparty1.jar</runtime-relative-path>          
                <binary-origin>release/modules/ext/3rdparty1.jar</binary-origin>
            </class-path-extension>

            <class-path-extension>
                <runtime-relative-path>ext/3rdparty2.jar</runtime-relative-path>          
                <binary-origin>release/modules/ext/3rdparty2.jar</binary-origin>
            </class-path-extension>

            [...]

Das genügt, damit die JAR-Dateien im NBM-Modul installiert werden können. Außerdem werden damit in den Projekt-Eigenschaften die Pakete der Bibliotheken auswählbar. Das ist auch zwingend notwendig, weil auch die eigenen Sourcen nur so auf die Klassen der JARs zugreifen können.

Also die Projekteingeschaften öffnen, zu "API Versioning" wechseln und nun die "Public Packages" auswählen, die innerhalb des Moduls benötigt werden.

Das war es auch schon. Noch eine Empfehlung zum Schluss: Die so verwendeten JAR-Dateien sollten ggf. immer um die vollständige Versionnummer ergänzt werden. Also nicht nur 3rdpart.jar verwenden, sondern diese Datei in 3rdparty_1-5-6.jar umbenennen. Alle fremden JAR-Dateien einer Module-Suite werden in den selben ext-Ordner kopiert. Das kann zu Überschreibungen und Versionkonflikten führen.

See Also

English Version

Not logged in. Log in, Register

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo