IStartup

Status
Nicht offen für weitere Antworten.

WieselAc

Top Contributor
Hallo,


ich habe ein Problem mit dem IStartup interface aus org.eclipse.ui


Ich habe eine relativ große Eclipse Application erstellt mit einer ganzen Reihe Plugins. Von diesen implementieren einige das oben genannte Plugin, da sie dll's laden sollen, die im späteren Porgramm zur Verfügung stehen müssen.

Klappt auch soweit alles super. Allerdings versuche ich via log4J Logdateien zu erstellen, in denen ich über das erfolgreiche (oder auch nicht) laden der dll's informiert werden möchte. Das klappt allerings nicht.

Ich erhalte immer eine Fehlermeldung die mich darauf hinweist das ich mehrere Log Instancen habe.


Hier mal der, wie ich glaube, entscheidende Ausschnitt der Fehlermeldung:


...

Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException:
Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which
is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.
You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.) (Caused by
org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException:
Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which
is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.
You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.))
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
at de.dsa.authoring.client.richgui.editors.symboldatatypeeditor.SymboldatatypeeditorPlugin.<clinit>(SymboldatatypeeditorPlugin.java:18)
... 32 more
...
Hab einige Umbrüche gemacht, damit es leserlich bleibt


Ich habe keine Ahnung, wie ich das Problem umgehen bzw. lösen soll. In den Plugins erzeuge ich mir immer einen lokalen LOGGER mit diesem Aufruf.

Code:
private static final Log LOGGER = LogFactory.getLog(Test.class);

Hat jemand eine Idee wo mein Denkfehler liegt??
 
S

SlaterB

Gast
der Fehler klingt nach zwei log4j-Libaries, falls du das noch nicht erkannt hattest,

wenn du selber manuell eine eingefügt hast, dann entferne die mal und schaue obs noch läuft,

evtl. musst du eine eigene nur zur Entwicklung unter Eclipse einbinden (bei der Autokorrektur/ Kompilierung),
aber beim Ausführen des Codes an anderer Stelle ist dann eine andere Log4J-Library schon da?
 
G

Guest

Gast
Hmm ja sowas hab ich mir gedacht. Aber das Problem ist, dass zumindest einige Plugins unabhängig von installierbar sein sollen. Deshalb ist in den entspechenden Plugins log4J in die Manifest miteingetragen und somit gibt es natürlich mehrere Log4J Libaries.

Das Problem scheint irgendwie zu sein, dass beim earlyStartup mehrmals Log4J in den gleichen Thread geladen wird.

Hab das nach etwas rumprobieren so umgangen, dass ich zuerst prüfe ob schon eine Log instance erstellt wurde wenn ja nutzt ich diese, ansonsten erzeuge ich mir eine neue. Allerdings verstehe ich nicht genau wieso eclipse damit durcheinander kommt.


Code:
private Log log; 


public void earlyStartup(){
    if(log==null){
        log =  = LogFactory.getLog(getClass());
    }

}
 
S

SlaterB

Gast
das hat mit Instanzen nix zu tun,
das ist die Frage, ob die Bibliothek log4j.jar 2x im Classpath enthalten ist,
das kannst du im Programm selber nicht beeinflussen
(soweit es meine Kenntnisse hergeben, ich vermute sowieso nur laut)
 

WieselAc

Top Contributor
Wie du dir bestimmt gedacht hast, der gast war ich.


Ich verstehe was du meinst, aber so wirklcih konnte ich den classpath nitt verfolgen, ich such da heute nochmal genauer.

Den komischen Ansatz mit dem Instanzcheck hatte ich nur mal provisorisch reingebaut, der hat zwar augenscheinlich etwas geholfen aber leider wie du vermutet hast das Problem an sich nicht gelöst.

Zuerst dachte ich, dass ich das Problem damit irgendwie in den Griff bekommen hätte (ohne zu verstehen wieso). Allerdings folg mit diesem Aufruf nur eine Exception und nicht wie sonst knappe 50 Folge Exceptions, weil die entsprechenden Plugins nicht geladen werden konnten. Die ist irgendwie in den ganzen Startinfos untergegangen.

Werd mich dann nochmal explizit durch den classpath wühlen. Gibts da irgend ne Möglichkeit rauszufinden, was da so alles rekursiv durch anhängigkeiten zu anderen Plugins drin steht?
 

WieselAc

Top Contributor
So Problem gelöst. Es war wie vermutet ein classpath Problem, das aber irgendwie nur beim IStartup zum tragen kam. Keine Ahnung wieso.

Auf jeden fall sollte man nicht dur die Plugin Dependencies, sondern auch die System JRE auf Dublikate checken :)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben