NoSuchMethodError: org.objectweb.asm.tree.ClassNode.<init>(I)V while using Parboiled

NoSuchMethodError: org.objectweb.asm.tree.ClassNode.<init>(I)V while using Parboiled

我有以下程序,它执行解析器。这是在格拉巴酒(半熟的叉子)中开发的

package com.test;

import org.parboiled.Parboiled;
import org.parboiled.parserunners.BasicParseRunner;
import org.parboiled.parserunners.ParseRunner;
import org.parboiled.support.ParsingResult;

public final class SampleRun
{
        public static void main(final String... args)
        {
        // 1. create a parser

        final TestGrammar parser = Parboiled.createParser(TestGrammar.class);
        // 2. create a runner
        final ParseRunner<String> runner
        = new BasicParseRunner<String>(parser.oneLine());
        // 3. collect the result

        @SuppressWarnings("deprecation")
        final ParsingResult<String> result
        = runner.run("sno101 snamegowtham");

        // 4. success or not?
        System.out.println(result.isSuccess());
        }
} 

语法测试

package com.test;

import com.github.parboiled1.grappa.parsers.EventBusParser;
import org.parboiled.Rule;
import org.parboiled.support.Var;

import java.util.HashMap;
import java.util.Map;

public class TestGrammar
    extends EventBusParser<String>
{
    protected final Map<String, String> collectedValues
        = new HashMap<String, String>();
    protected final Var<String> var = new Var<String>();

    Rule key()
    {
        return sequence(
            firstOf(ignoreCase("sno"), ignoreCase("sname")),
            var.set(match().toLowerCase()),
            !collectedValues.containsKey(var.get())
        );
    }

    Rule separator()
    {
        return optional(anyOf(":-*_ "));
    }

    Rule value()
    {
        return sequence(
            oneOrMore(testNot(wsp()), ANY),
            collectedValues.put(var.get(), match()) == null
        );
    }

    Rule oneLine()
    {
        return join(sequence(key(), separator(), value()))
            .using(oneOrMore(wsp()))
            .min(2);
    }
}

但是,当我尝试执行上述程序时出现以下错误。

Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.tree.ClassNode.<init>(I)V
    at org.parboiled.transform.ParserClassNode.<init>(ParserClassNode.java:50)
    at org.parboiled.transform.ParserTransformer.extendParserClass(ParserTransformer.java:93)
    at org.parboiled.transform.ParserTransformer.transformParser(ParserTransformer.java:63)
    at org.parboiled.Parboiled.createParser(Parboiled.java:64)
    at com.test.SampleRun.main(SampleRun.java:15)

我有以下 maven 依赖项

  1. grappa-1.0.4.jar
  2. asm-debug-all-5.0.3.jar
  3. guava-18.0.jar
  4. jitescript-0.4.0.jar

这是我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>parboiledprogram</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
      <dependency>
        <groupId>com.github.parboiled1</groupId>
        <artifactId>grappa</artifactId>
        <version>1.0.4</version>
      </dependency>
  </dependencies>
</project>

注意:我正在使用 Eclipse Juno Service Release 2


一些失败的尝试


我注意到 asm-debug-all-5.0.3.jar 的以下图标,我不确定这个图标在 eclipse juno 中是什么意思。

  1. 此外,在依赖项 jitesscript-0.4.0.jarpom.xml 中,我注意到 org.objectweb.asm 包的重新定位。但是,类 中也包含 ClassNode(int) jitescript 更新是在 16-Apr-2014asm-debug-all-5.0.32014 年 5 月 24 日

  2. 我已经尝试删除 jitescript.jar 并更新了 maven 项目,还清理并构建了它,但仍然没有用。

  3. 我还在 KEPLER 中测试了这个,没有使用 maven,通过手动包含上面列出的所有依赖项。但是,我仍然遇到同样的错误。这意味着问题不在于 Maven,而在于其他东西。

错误是由于我的 jre\lib\ext 文件夹中存在 dcevm.jar。我用于该项目的 jdk 包含 dcevm.jar 文件,并且此 jar 包含 org.objectweb.asm.treecontainsClassNodewith no constructor like ClassNode(int).

jvm 使用这个 jar 而不是 maven 依赖项中的 jar 文件,即如果项目使用的 JRE 系统库中的任何 jar 文件中存在 classes,它们覆盖 Maven 罐子中存在的 classes。

因此,我从 jre\lib\ext 中删除了 dcevm.jar 然后在我的 eclipse 首选项中,我将执行环境更改为一个新环境(到我的 jdk 路径, jdk1.7.0_13) 并默认使用。

总结

由于包含class 的jar 文件版本不同,显然会出现此类错误。要识别它们:

  1. 首先,在 eclipse Open Type (Ctrl+Shift+T) 中搜索 class(例如 ClassNode),您将查找具有相同 class 名称和包的不同文件。您还可以查看它们所在的位置。
  2. 打开每一个并检查其中没有找到该方法。消除它。

注意:如果 JRE 系统库中存在 class,那么这很可能会覆盖 maven 依赖项中的那个。