2015-01-24 7 views
1

У меня есть следующая программа, которая выполняет парсер. Составляется в граппы (форк пропаренного)NoSuchMethodError: org.objectweb.asm.tree.ClassNode. <init> (I) V при использовании 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

Вот мой 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. Кроме того, в pom.xml в зависимости jitesscript-0.4.0.jar я заметил переселение org.objectweb.asm пакета. Однако классы, которые тоже содержат ClassNode(int)jitescript был обновлен на 16-апр-2014 тогда asm-debug-all-5.0.3 был на 24-май-2014

  2. Я попытался удалить jitescript.jar и обновил Maven проект, а также очистить и построить его, но по-прежнему бесполезно.

  3. Я также проверил это в KEPLER без использования maven вручную, включая все зависимости, перечисленные выше. Но все же, я получаю ту же ошибку. Это означает, что проблема была не с Maven, а с чем-то еще.

+0

Что любопытно здесь, что если у вас ДЕЙСТВИТЕЛЬНО есть asm jar, существует конструктор ClassNode (int) ... Все, что делает ParserClassNode, это вызов 'super (Opcodes.ASM5)'; Я не вижу причин, почему это не удается :( – fge

+0

Я протестировал с помощью простого «AbcParser», и он сработал. Можете ли вы опубликовать «TestGrammar»? –

+0

@JavaTechnical Я создал проект, подобный вашему, и он работал. См. Здесь: http: // goo .gl/WDZh1I. Попробуйте обновить свой проект, полностью очистите и перестройте, я не вижу причин, почему это не удается. –

ответ

2

Ошибка обусловлена ​​наличием dcevm.jar присутствующих в моей jre\lib\ext папке. Jdk, который я использовал для проекта, содержит файл dcevm.jar и что в этой банке содержится пакет org.objectweb.asm.tree, который contains ClassNode with no constructor like ClassNode(int).

jvm использует эту банку вместо файла jar в зависимостях maven, т.е. если в любой из файлов jar в библиотеке JRE, используемой проектом, есть классы, которые используются в проекте, они переопределяют классы, присутствующие в maven jars.

Поэтому я удалил dcevm.jar из jre\lib\ext, а затем в моих затмений предпочтений, я изменил среду исполнения на новый (на мой JDK путь, jdk1.7.0_13) и используется в по умолчанию.

Резюме

Такие ошибки происходят явно из-за разные версии файлов .jar, содержащего класс. Для того, чтобы определить их:

  1. Во-первых, поиск класса (напр. ClassNode) в затмение открытого типа (Ctrl + Shift + T) и вы найдете различные файлы с одинаковым именем класса и пакет тоже. Вы также можете увидеть, где они находятся.
  2. Откройте каждый из них и проверьте, какой метод не найден. Устраните это.

Примечание: Если класс присутствует в системной библиотеке JRE, это скорее всего переопределит значение в зависимости от maven.