繁体   English   中英

在使用Tycho构建的Eclipse插件中加载Antlr jar的加载程序约束违规

[英]Loader Constraint Violation loading Antlr jar in Eclipse plugin built with Tycho

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

我通常使用“ Eclipse应用程序”启动配置对其进行测试,将所有插件加载到工作区中。 这可行。

有时,我会参考本地构建的更新站点zip对其进行测试。 这在大多数情况下都有效。

最近,与我一起工作的其他人已将更新站点部署到公共URL( 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进行测试时,有时确实会看到相同的异常,但很少见。 每次使用此已部署的更新站点,我都会看到它。

因此,我知道“链接错误”表示该类已经由与此冲突的另一个类加载器加载。

因此,我再次使用“ -verbose:class”重新启动它,至少可以看到有关此类加载的一些信息。

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

[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存储库中获取了几个jar,而不是p2存储库,其中包括“ antlr4-runtime-4.5.1.jar”文件。 这些罐子中的大多数在公共p2存储库中不可用。 其中一个插件使用“ maven-dependency-plugin”的“ copy”和“ copy-dependencies”目标获取Maven工件,然后在META的“ Bundle-ClassPath”属性中指定这些jar的本地路径。 -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)

更新

我意识到将“ -verbose:class”添加到启动配置测试用例可能很有用,因为这没有此问题。 当我在输出中搜索相同的类引用时,我只看到一种情况:

[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文件中加载它。

这是因为Checkstyle Eclipse插件“泄漏”了另一个版本的ANTLR到另一个使用Package-Import的Eclipse插件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM