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 依赖项
- grappa-1.0.4.jar
- asm-debug-all-5.0.3.jar
- guava-18.0.jar
- 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 中是什么意思。
此外,在依赖项 jitesscript-0.4.0.jar
的 pom.xml 中,我注意到 org.objectweb.asm
包的重新定位。但是,类 中也包含 ClassNode(int)
jitescript
更新是在 16-Apr-2014 而 asm-debug-all-5.0.3
是2014 年 5 月 24 日
我已经尝试删除 jitescript.jar 并更新了 maven 项目,还清理并构建了它,但仍然没有用。
我还在 KEPLER 中测试了这个,没有使用 maven,通过手动包含上面列出的所有依赖项。但是,我仍然遇到同样的错误。这意味着问题不在于 Maven,而在于其他东西。
错误是由于我的 jre\lib\ext
文件夹中存在 dcevm.jar
。我用于该项目的 jdk 包含 dcevm.jar
文件,并且此 jar 包含 org.objectweb.asm.tree
包 contains
ClassNodewith 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 文件版本不同,显然会出现此类错误。要识别它们:
- 首先,在 eclipse Open Type (Ctrl+Shift+T) 中搜索 class(例如
ClassNode
),您将查找具有相同 class 名称和包的不同文件。您还可以查看它们所在的位置。
- 打开每一个并检查其中没有找到该方法。消除它。
注意:如果 JRE 系统库中存在 class,那么这很可能会覆盖 maven 依赖项中的那个。
我有以下程序,它执行解析器。这是在格拉巴酒(半熟的叉子)中开发的
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 依赖项
- grappa-1.0.4.jar
- asm-debug-all-5.0.3.jar
- guava-18.0.jar
- 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 中是什么意思。
此外,在依赖项
jitesscript-0.4.0.jar
的 pom.xml 中,我注意到org.objectweb.asm
包的重新定位。但是,类 中也包含ClassNode(int)
jitescript
更新是在 16-Apr-2014 而asm-debug-all-5.0.3
是2014 年 5 月 24 日我已经尝试删除 jitescript.jar 并更新了 maven 项目,还清理并构建了它,但仍然没有用。
我还在 KEPLER 中测试了这个,没有使用 maven,通过手动包含上面列出的所有依赖项。但是,我仍然遇到同样的错误。这意味着问题不在于 Maven,而在于其他东西。
错误是由于我的 jre\lib\ext
文件夹中存在 dcevm.jar
。我用于该项目的 jdk 包含 dcevm.jar
文件,并且此 jar 包含 org.objectweb.asm.tree
包 contains
ClassNodewith 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 文件版本不同,显然会出现此类错误。要识别它们:
- 首先,在 eclipse Open Type (Ctrl+Shift+T) 中搜索 class(例如
ClassNode
),您将查找具有相同 class 名称和包的不同文件。您还可以查看它们所在的位置。 - 打开每一个并检查其中没有找到该方法。消除它。
注意:如果 JRE 系统库中存在 class,那么这很可能会覆盖 maven 依赖项中的那个。