NoSuchMethodError:org.objectweb.asm.tree.ClassNode。<init>(I)V使用Parboiled </init>

时间:2015-01-24 13:58:34

标签: java maven 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());
        }
} 

TestGrammar

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. 格拉巴-1.0.4.jar
  2. ASM-调试全5.0.3.jar
  3. 番石榴18.0.jar
  4. jitescript-0.4.0.jar
  5. 这是我的 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中的含义。

    enter image description here

    1. 此外,在依赖项jitesscript-0.4.0.jar的{​​{3}}中,我注意到org.objectweb.asm包的重定位。但是,其中的类也包含已更新的ClassNode(int) jitescript位于 2014年4月16日,而asm-debug-all-5.0.3位于 24-May- 2014

    2. 我试图删除jitescript.jar并更新maven项目,并清理并构建它但仍然没用。

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

1 个答案:

答案 0 :(得分:2)

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

jvm在maven依赖项中使用此jar而不是jar文件,即如果项目使用的JRE系统库中的任何jar文件中都存在类,则它们会覆盖maven中存在的类广口瓶中。

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

<强>摘要

由于包含该类的不同版本的jar文件,此类错误很明显。识别它们:

  1. 首先,在eclipse 打开类型(Ctrl + Shift + T)中搜索类(例如ClassNode),你会发现具有相同类名和包的不同文件。您还可以看到它们的位置。
  2. 打开每个并检查找不到该方法。消除它。
  3. 注意:如果该类存在于JRE系统库中,则可能会覆盖maven依赖项中的类。