2016-04-22 25 views
0

Ich habe an einer Eclipse-Plug-in-Codebase gearbeitet, die mit Maven Tycho erstellt wird. Ich kann einige Snippets bereitstellen, nach denen jeder fragt, aber Sie können den Code unter https://git.opendaylight.org/gerrit/#/admin/projects/yangide bekommen (ich glaube, das sollte offen sein).Loader Constraint Violation wird geladen Antlr jar im Eclipse-Plugin mit Tycho erstellt

Ich teste es normalerweise mit einer "Eclipse Application" Startkonfiguration, die alle Plugins im Arbeitsbereich lädt. Das funktioniert.

Ich teste es manchmal, indem ich auf die Update-Site-PLZ verweise, die ich lokal erstelle. Dies funktioniert die meiste Zeit.

Kürzlich hat jemand anderes, mit dem ich arbeite, die Update-Site auf eine öffentliche URL (https://nexus.opendaylight.org/content/sites/p2repos/org.opendaylight.yangide) bereitgestellt. Dies wurde vom Meister gebaut.

Als ich von dieser Installation in eine eigenständige Eclipse zu einem bestimmten Zeitpunkt nach dem Start ich folgende Fehlermeldung angezeigt:

Exception:java.lang.LinkageError: org/antlr/v4/runtime/TokenStream 
at org.antlr.v4.runtime.Parser.setInputStream(Parser.java:530) 
at org.antlr.v4.runtime.Parser.<init>(Parser.java:182) 
at org.opendaylight.yangtools.antlrv4.code.gen.YangParser.<init>(YangParser.java:188) 

Ich habe diese gleiche Ausnahme tatsächlich gesehen manchmal, wenn mit der lokal gebaut Update-Site zip testen aber selten. Ich sehe es jedes Mal mit dieser bereitgestellten Update-Site.

Also verstehe ich, dass "Linkage Error" bedeutet, dass die Klasse bereits von einem anderen Klassenlader geladen wurde, der damit kollidiert.

Also habe ich es wieder mit "-verbose: class" gestartet, um zumindest einige Informationen über das Laden dieser Klasse zu sehen.

Von diesem Ausgang, sah ich die folgenden:

[Loaded org.antlr.v4.runtime.TokenStream from file:/home/opnfv/frameworks/eclipse-neon/java-mars/eclipse/../../../../.p2/pool/plugins/net.sf.eclipsecs.checkstyle_6.16.0.201603042321/checkstyle-6.16.1-all.jar] 
[Loaded org.antlr.v4.runtime.TokenStream from file:/home/opnfv/frameworks/eclipse-neon/java-mars/eclipse/configuration/org.eclipse.osgi/605/0/.cp/libs/antlr4-runtime-4.5.1.jar] 
[Loaded org.antlr.v4.runtime.TokenStream from file:/home/opnfv/.m2/repository/org/antlr/antlr4-runtime/4.5.1/antlr4-runtime-4.5.1.jar] 

Beachten Sie, dass dieses Plugin mehrere Gläser aus einem Maven Repo erhält, als zu einem p2 Repo gegen, darunter die „antlr4-Runtime-4.5.1. Jar "Datei. Die meisten dieser Gläser sind in einem öffentlichen p2-Repo nicht verfügbar. Eines der Plugins verwendet die "copy" - und "copy-dependencies" -Ziele des "maven-dependency-plugins", um Maven-Artefakte zu erhalten, und spezifiziert dann die lokalen Pfade zu diesen jars in der "Bundle-ClassPath" -Eigenschaft im META -INF/MANIFEST.MF-Datei. Andere Plugins in der Codebasis spezifizieren dieses Plugin als eine Abhängigkeit.

aktualisieren:

Bitte beachte, dass ich die folgende Variation dieses im Protokoll manchmal sehen:

Exception in thread "Yang indexer" java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) previously initiated loading for a different type with name "org/antlr/v4/runtime/TokenStream" 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:272) 
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:632) 
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:588) 
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:540) 
    at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:527) 
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:324) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:327) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:402) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344) 
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at org.antlr.v4.runtime.Parser.setInputStream(Parser.java:530) 

aktualisieren:

Ich erkennen, dass es nützlich sein könnte hinzufügen "-verbose: class" zum Startkonfigurations-Testfall, weil dieses Problem nicht auftritt. Wenn ich für die gleiche Klasse Referenz in der Ausgabe gesucht, ich sah nur ein Vorkommen:

[Loaded org.antlr.v4.runtime.TokenStream from file:/home/opnfv/workspace3/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/../../../../../../../media/sf_laptophome/git/yangide/plugins/com.cisco.yangide.yangparser/libs/antlr4-runtime-4.5.1.jar] 

Denken Sie daran, dass dies nur ist den Plugins aus dem Arbeitsbereich zu laden. Dieser Pfad befindet sich im Wesentlichen in meinem Arbeitsbereich. In jedem Fall hat es nie versucht, es aus diesen anderen beiden JAR-Dateien zu laden.

+0

Nur für die Aufzeichnung für jeden, der dieses Q von Googling schlägt (wie ich gerade tat): https://bugs.opendaylight.org/show_bug.cgi?id = 5798 erstellt, um zu einer Lösung dieses Problems zu kommen. – vorburger

Antwort

0

Das war, weil das Checkstyle Eclipse-Plugin eine andere Version von ANTLR in dieses andere (yangide) Eclipse-Plugin "durchsickerte", das einen Paket-Import verwendet.