将ANTLR生成的类文件放入一个jar文件中

时间:2010-03-07 21:40:06

标签: java jar antlr

使用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 {

1 个答案:

答案 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