首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载器违反约束加载Tycho构建的Eclipse插件中的Antlr jar

加载器违反约束加载Tycho构建的Eclipse插件中的Antlr jar
EN

Stack Overflow用户
提问于 2016-04-22 16:23:54
回答 1查看 188关注 0票数 0

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

我通常使用“”启动配置来测试它,加载工作区中的所有插件。这个很管用。

我有时通过引用本地构建的更新站点zip来测试它。这在大多数情况下是可行的。

最近,与我一起工作的其他人已经将更新站点部署到公共URL (https://nexus.opendaylight.org/content/sites/p2repos/org.opendaylight.yangide)中。这是师父做的。

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

代码语言:javascript
复制
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“启动它,至少可以看到一些有关这个类的加载的信息。

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

代码语言:javascript
复制
[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回购获得了几个jars,而不是p2回购,包括“antlr4 4-运行时-4.5.1.jar”文件。大多数这些jars在公共p2回购中是不可用的。其中一个插件使用“Maven依赖项-插件”的“复制”和“复制依赖”目标来获取Maven工件,然后在META/MANIFEST.MF文件中指定到"Bundle-ClassPath“属性中这些jars的本地路径。代码库中的其他插件将该插件指定为依赖项。

更新

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

代码语言:javascript
复制
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“可能是有用的,因为这没有这个问题。当我在输出中搜索相同的类引用时,我只看到了一次:

代码语言:javascript
复制
[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文件加载它。

EN

回答 1

Stack Overflow用户

发布于 2016-04-29 17:27:09

这是因为Checkstyle Eclipse插件“泄露”了另一个版本的ANTLR到另一个(yangide) Eclipse插件中,该插件使用了Package。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36798891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档