2012-08-14 20 views
7

Wir untersuchen derzeit die Verwendung von OneJar in unserer Anwendung (aus mehreren Gründen), aber unsere Anwendung verwendet eine Reihe von benutzerdefinierten URLClassloader s, um Anwendungserweiterungen zu laden.OneJar und dynamische Klassen laden

Wenn als ein "OneJar" Glas gebündelt, erhalten wir ClassNotFound Ausnahmen. Die fraglichen Klassen befinden sich in dem gebündelten Jar und wir verlassen uns einfach auf den Klassenlademechanismus, um die Eltern/Kind-Beziehung aufzulösen.

Das ist. Wir haben eine gemeinsame interface, die in der gebündelten Jar (die im Classloader-Kontext der Eltern sein soll) gespeichert ist. Die Erweiterung implementiert diese interface (ermöglicht es uns, in die Erweiterung aufzurufen) und beruht auf der Fähigkeit des untergeordneten Klassenladeprogramms, die Ressourcenfindungsfunktionen des übergeordneten Klassenladeprogramms zu verwenden.

Hat irgendjemand irgendwelche Erfahrungen damit gemacht oder irgendein Licht darauf geworfen, wie wir es lösen könnten.

Ich würde in anderen ähnlichen Mechanismen interessiert sein (für unsere Bibliothek Jar in einer einzigen Jar Ressource zu bündeln, die nicht Gebrauch erfordert alles und Jar in einer einzigen Datei unjar)

+0

Sie wissen, das Hinzufügen, wenn Sie den Mut der Menschen, die nach unten Abstimmung ohne mit zumindest den Anstand zu lieben haben einen Kommentar zu lassen, warum sie hielt es für notwendig, dies zu tun. Es hilft niemandem. Ohne irgendeine Erklärung ist es schwierig zu wissen, wie man die Frage/Antwort in Zukunft verbessern kann. – MadProgrammer

Antwort

6

Ich fand ich machte einige Annahmen darüber, wie unser Klassenlader erstellt wurde.

ging ich davon aus, dass der Klassenlader seiner Klasse Loader verwenden würde, wie es Eltern (dh getClass(). GetClassLoader()), aber es war nicht

Stattdessen wurde die SystemClassLoader verwenden. Das bedeutet, dass der Kind-Classloader nach der freigegebenen Schnittstelle gesucht hat, weil er den SystemClassLoader und nicht den OneJar Class Loader gefunden hat.

ich behoben dies durch CustomClassLoader.class.getClassLoader() an den Konstruktor unserer benutzerdefinierten Klassenlader

+0

Könnten Sie Ihre eigene Antwort akzeptieren? – fglez

+0

@fglez Dachte, es war das "fertig" Ding, aber wenn es hilft ... – MadProgrammer