【发布时间】:2016-04-22 16:23:54
【问题描述】:
我一直在开发一个使用 Maven Tycho 构建的 Eclipse 插件代码库。我可以提供一些任何人要求的 sn-ps,但您可以在https://git.opendaylight.org/gerrit/#/admin/projects/yangide 获得代码(我相信应该是开放的)。
我通常使用“Eclipse 应用程序”启动配置来测试它,加载工作区中的所有插件。这行得通。
我有时会通过引用我在本地构建的更新站点 zip 来测试它。这在大多数情况下都有效。
最近,与我一起工作的其他人已将更新站点部署到公共 URL (https://nexus.opendaylight.org/content/sites/p2repos/org.opendaylight.yangide)。这是从 master 构建的。
当我从这里安装到独立的 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”文件。大多数这些 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 文件中加载它。
【问题讨论】:
-
只是为了记录任何通过谷歌搜索此 Q 的人(就像我刚才所做的那样):bugs.opendaylight.org/show_bug.cgi?id=5798 创建以跟踪解决此问题。
标签: java eclipse maven antlr4 tycho