Java Plugin System

  • Hey,


    ich bin derzeit am Coden eines eigenen Plugin Systems (ähnlich dem von Bukkit).
    Das Laden der einzellen .jar datein im Plugins ordner funktioniert bereits.


    Jedoch können die einezelnen .jar sich nicht untereinander benutzen.


    Mein Ziel:

    Ich möchte dass ich in Plugin B einen Methode von Plugin A ausführen.

    Derzeit kommte jedoch immer eine "java.lang.NoClassDefFoundError"

    Plugins lade ich derzeit wiefolgt:



    Ich werde später auch noch einen plugin.yml hinzufügen, aber das möchte ich erst machen, wenn das gesamte grundlegent funktioniert.
    Danke für hilfe im Voraus.


    MFG

    CheeseTastisch

  • Sorry,

    aber nachdem ich diesen Code nicht selbst geschrieben habe, check ich bei der hälfte nicht, was das Ziel dahinter ist.
    Auserdem sind das zimlich viele Klassen, wo ich nicht weiß, wann welche Klasse was called (z.B.: einen URLClassLoader habe ich garnicht gefunden...)

    LG

  • JD-Gui z.B besitzt eine Such-Funktion wo du einfach nach URLClassLoader suchen kannst...

    Ich mache das jetzt für dich, damit hast du mal wieder etwas gelernt fürs Leben :)


    Hier: das hat mich unter 1 Minute gebraucht(ernstgemeint)



    Hoffe das hilft!

    LG

  • Danke,

    hierbei besteht alerdings noch immer das ich den Code nur sehr schlecht verstehe, da ich ihn nicht selbst geschrieben habe.
    Aber nach langem begutachten, habe ich ihn halbwächs verstanden...
    Nur mein Problem, ich sehe nicht was Bukkit anders macht also ich.


    LG

  • Um den sinn dahinter zu verstehen, sollte man wissen, das wir mehrer sind, die an diesem System arbeiten.

    Am ende soll es auserdem verschiedene Versionen geben und jeder sollte theoretisch sein eigenen Plugin coden können.

    Deshalb war unsere Idee eben ein Plugin-System.


    Und der Sinn dahinter, dass einzelne Plugins aufeinander zugreifen können ist auch zimlich simpel:

    Jemand coded sich ein Plugin für das System mit z.B.: einer User-Klasse. Diese liest informationen zu einem User aus einer Datenbank aus, und speicher sie.
    Wenn jetzt jemand anders dieses Plugin benutzt, soll er eben auch auf den User zurgreifen können, hätte ja keinen sinn, wenn jemand das gesamte Plugin nochmalls extra imporieren müsste...

    Und wegen directory und classpath: Die Plugins zu laden funktioniert ja bereits, nur das sie sich untereinander benutzen können noch nicht.

    LG

  • Du kannst ja selbst so etwas wie eine plugin.yml umsetzen - dort hat man dann die Möglichkeit eine "dependency" anzugeben, diese wird dann einfach vor deinem plugin geladen.


    In IntelliJ musst du das andere Plugin so oder so importieren, sonst gibt es ja keine Referenzen zu den Klassen.


    Lg

  • Du kannst ja selbst so etwas wie eine plugin.yml umsetzen - dort hat man dann die Möglichkeit eine "dependency" anzugeben, diese wird dann einfach vor deinem plugin geladen.


    Problem hierbei ist nur wieder, was wenn es mehrere dependencys gibt?
    Minecraft bekommt es ja auch irgendwie hin, ohne das sich Plugins untereinander laden.
    Bei Minecraft, lädt die Bukkit.jar jedes Plugin und torzdem können sich die Plugins untereinander benutzen.


    In IntelliJ musst du das andere Plugin so oder so importieren, sonst gibt es ja keine Referenzen zu den Klassen.

    Ist logisch.

    LG

  • Dependency-Graphen bauen und in der entsprechenden Reihenfolge die Plugins laden

    MfG


    00110101 00110001 00110101 00111000 00110100 00110110 00110011 00110001 00110101 00111001 00110101 00110111 00110100 00110110 00110011 00110000 00110110 00110001 00110101 00110111 00110100 01000100 00110011 01000100 8o

  • Dependency-Graphen bauen und in der entsprechenden Reihenfolge die Plugins laden

    Glaube du hast das Problem noch nicht ganz verstanden.
    Das wäre ja nich das Problem, das Problem ist nur, auch wenn die Plugins nach einander geladen werden, können sie sich untereinander nicht benutzen.

    Wenn PluginB nach PluginA geladen wird, kann PluginB trozdem keine Klasse von PluginA benutzen.

    LG

  • Okay, ich korrigiere mich: alle Jars in einen ClassLoader mittels des Arrays übergeben und dann in der entsprechenden Reihenfolge die Konstruktoren aufrufen

    MfG


    00110101 00110001 00110101 00111000 00110100 00110110 00110011 00110001 00110101 00111001 00110101 00110111 00110100 00110110 00110011 00110000 00110110 00110001 00110101 00110111 00110100 01000100 00110011 01000100 8o

  • Danke,


    hab es endlich hinbekommen.

    Für alle die Fragen wie:



    Für @SneakyThrows benötigt man Lombok.
    Für Document#loadDocument ein etwas modifiziertes BSON-Document (von MongoDB)