Loader Constraint Violation在使用Tycho

时间:2016-04-22 16:23:55

标签: java eclipse maven antlr4 tycho

我一直致力于使用Maven Tycho构建的Eclipse插件代码库。我可以提供一些任何人要求的片段,但您可以在https://git.opendaylight.org/gerrit/#/admin/projects/yangide获取代码(我相信应该是开放的)。

我通常使用" Eclipse Application"来测试它。启动配置,加载工作区中的所有插件。这很有效。

我有时通过引用我在本地构建的更新站点zip来测试它。这大部分时间都有效。

最近,与我合作的其他人已将更新网站部署到公共网址(https://nexus.opendaylight.org/content/sites/p2repos/org.opendaylight.yangide)。这是由大师建造的。

当我从此安装到独立的Eclipse中时,在启动后的某个时刻我看到以下错误:

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)

我在使用本地构建的更新站点zip进行测试时,实际上看到了同样的异常,但很少。我每次使用此部署的更新站点都会看到它。

所以我理解&#34;链接错误&#34;意味着该类已被另一个与此冲突的类加载器加载。

所以,我用&#34; -verbose:class&#34;再次启动它。至少看一些关于这门课程加载的信息。

从这个输出中,我看到了以下内容:

[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]

请注意,此插件从Maven仓库获取几个罐子,而不是p2仓库,包括&#34; antlr4-runtime-4.5.1.jar&#34;文件。大多数这些罐子都不在公共p2回购中。其中一个插件使用&#34; copy&#34;和&#34;复制依赖&#34; &#34; maven-dependency-plugin&#34;的目标获取Maven工件,然后在&#34; Bundle-ClassPath&#34;中指定这些jar的本地路径。 META-INF / MANIFEST.MF文件中的属性。代码库中的其他插件将该插件指定为依赖项。

更新

请注意,我有时会在日志中看到以下变体:

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)

更新

我意识到添加&#34; -verbose:class&#34;到启动配置测试用例,因为没有这个问题。当我在输出中搜索相同的类引用时,我只看到一次出现:

[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]

请记住,这只是从工作区加载插件。此路径基本上在我的工作区中。无论如何,它从未尝试从其他两个jar文件中加载它。

1 个答案:

答案 0 :(得分:0)

这是因为Checkstyle Eclipse插件&#34;泄漏了#34;另一个版本的ANTLR到另一个(yangide)Eclipse插件中,该插件使用Package-Import。