使用ANTLR,我在编译后得到一些java类文件。 我需要将所有类文件放入一个jar文件中。
我制作manifest.mf文件,其中有一行“Main-class:Test”表示主文件。 我运行'jar cmf manifest.mf hello.jar * .class'来获取hello.jar文件。
但是当我尝试运行'java -jar hello.jar'时,我收到以下错误消息。
$ java -jar hello.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/runtime/CharStream Caused by: java.lang.ClassNotFoundException: org.antlr.runtime.CharStream at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:315) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) at java.lang.ClassLoader.loadClass(ClassLoader.java:250) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398)
怎么了? 当我运行'java Test'时,我得到了正确的结果。
我使用的示例是“The Definitive ANTLR Reference”一书中的源代码,您可以从http://www.pragprog.com/titles/tpantlr/source_code下载
示例位于/ tour / trees /中。编译g和java文件后,我得到了一堆类文件。
使用unzip -l,我得到以下信息。
Archive: hello.jar Length Date Time Name -------- ---- ---- ---- 0 03-07-10 17:51 META-INF/ 78 03-07-10 17:51 META-INF/MANIFEST.MF 5872 03-07-10 14:05 Eval.class 1020 03-07-10 14:05 ExprLexer$DFA5.class 5713 03-07-10 14:05 ExprLexer.class 429 03-07-10 14:05 ExprParser$atom_return.class 429 03-07-10 14:05 ExprParser$expr_return.class 437 03-07-10 14:05 ExprParser$multExpr_return.class 429 03-07-10 14:05 ExprParser$prog_return.class 429 03-07-10 14:05 ExprParser$stat_return.class 11048 03-07-10 14:05 ExprParser.class 1129 03-07-10 14:05 Test.class -------- ------- 27013 12 files
Test.java如下所示。
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class Test {
public static void main(String[] args) throws Exception {
答案 0 :(得分:2)
您用于Test类的包命名空间是什么?
说,如果你的主要课程是pro.seek.Test, 你把它表现为
吗?Main-class: pro.seek.Test
Antler会产生文件夹层次结构
whatever/pro/seek
以便在
找到您的主类文件whatever/pro/seek/Test.java
当你震动文件时,你是否首先cd到“whatever”文件夹,以便在创建jar时你的jar内容植根于“pro”文件夹?因此,当您使用zip查看器列出jar文件时,您可以看到层次结构/ pro / seek /,您可以在其下找到一堆生成的java源文件。
您是否正确创建了jar文件?可能不是一个antlr问题,而是关于如何创建可执行jar的问题。
这里有进一步的想法:
运行hello.jar时没有包含antlr分发jar的路径。
在清单中将其指定为
Class-Path: antlr-3.1.1-runtime.jar
或以
运行hello.jar时指定它jar hello.jar -classpath antlr-3.1.1-runtime.jar
并确保hello.jar旁边有antlr jar。
当您的java源代码在编译期间使用任何库时,在运行编译代码时必须包含这些库,这应该是非常明显的规则,因为计算机需要知道如何处理对库进行的调用例程。
说,有人在类Truth中编写了一个例行程序showMe(boolean theTruth),并将它放在一个罐子中.jhat.jar:
public class Truth{
static public void showMe(boolean theTruth){
if (theTruth)
println("It's a lie");
else
println("Thanks for the truth");
}
}
你的Test.java有一个电话
Truth.showMe(false);
你必须包含Truth.jar,否则jvm如何知道如何处理对showMe()的调用?
Antlr生成了一堆java源文件,并且它们调用了antlr运行时,因此您需要在运行时类路径中包含antlr运行时。您的运行时错误显示jvm正在查找在antrl运行时jar中找到的org.antlr.runtime.CharStream类。
http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html