【问题标题】:ANTLR Ubuntu Java MakefileANTLR Ubuntu Java Makefile
【发布时间】:2014-08-20 09:13:50
【问题描述】:

我一直在尝试测试一些学生编写的简单项目。我在 Ubuntu 上对其进行测试,该项目要求我使用 ANTLR 和 Makefile。 找到一个编译执行成功的makefile、文件和文件夹的配置是一场噩梦。

所以基本上这是文件夹/文件设置:

Makefile
test.txt
laboratorio/
  lab02/
    Main.java
    Lab02.g

Main.java 的内容相当简单。他们只是逐个标记地读取语法标记:

package laboratorios.lab02;
import org.antlr.v4.runtime.*;

public class Main{
    public static void main(String[] args) throws Exception{
        try{
            Lab02 lexer = new Lab02(new ANTLRFileStream(args[0]));
            while (lexer.nextToken().getType() != Token.EOF);
        }catch(ArrayIndexOutOfBoundsException aiobe){
            System.err.println("Must provide a valid path to the filename with the tokens");
            System.exit(1);
        }catch(Exception e){
            System.err.println("Must provide a valid path to the filename with the tokens");
            System.exit(1);
        }
    }
}

Lab02.g(语法)的内容与问题无关,但它会生成一个 Lab02.java 文件(带有包 labatorios.lab02),该文件必须由 Main.java 文件编译和引用。

尝试在 Ubuntu 上测试 makefile 时出现问题。在我尝试的每个配置中,我都不断收到错误(在编译或运行 Main java 文件时),例如:

  • java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream
  • 无法找到或加载主类 org.antlr.v4.Tool
  • 错误:无法找到或加载主类

我已经按照本教程的确切步骤在我的电脑上设置了 antlr:Getting Started with ANTLR v4

【问题讨论】:

    标签: java ubuntu makefile antlr antlr4


    【解决方案1】:

    经过多次不成功的尝试,我得到了这个神奇的配置,使整个项目运行良好。

    生成文件:

    make:  gramatica main
    
    gramatica: laboratorios/lab02/Lab02.g
        java org.antlr.v4.Tool laboratorios/lab02/Lab02.g
    
    main: laboratorios/lab02/Lab02.java laboratorios/lab02/Main.java
        javac laboratorios/lab02/Lab02.java laboratorios/lab02/Main.java
    
    run: laboratorios/lab02/Main.class
        java -cp ${CLASSPATH}:Lab02.class laboratorios/lab02/Main test.txt
    
    clean:
        rm -rf laboratorios/lab02/*.tokens
        rm -rf laboratorios/lab02/*.class
        rm -rf laboratorios/lab02/Lab02.java
        rm -rf laboratorios/lab02/*~
    

    我要求我像这样在 bashrc 中设置 CLASSPATH:

    export CLASSPATH=.:~/your/path/to/antlr/antlr-4.2-complete.jar
    

    您会在我之前提到的教程 (Getting Started with ANTLR v4) 中找到,它说您应该使用引号编写 Classpath。完全忽略该建议!每当我使用引号时,主类都不会运行,因为 ANTLR 是“丢失”的。此外,教程中的别名是完全可选的。

    其他一些值得指出的事情是,将 Makefile 放在 labatorio/lab02/ 文件夹中也没有帮助。将其移出并从外部引用 java 文件有很大帮助。字符“.:”有助于执行 Main 类,因为它会说它找不到。

    【讨论】:

    • . 是当前目录,所以.: 中的CLASSPATH 表示包含当前目录。作业路径部分的引号是正确的。您的问题是引号内的~ 不会以您想要的方式扩展(因为~ 是额外的特殊魔法)。所以不要使用它。请改用$HOME 并使用引号。
    • 您也可以在 make 规则中使用 $^ 来表示“所有先决条件”。如果您只需要 CLASSPATH 用于此 makefile,那么您可以在 makefile 中设置(和导出)它,而不是在您的常规 shell 中。
    • 我确实注意到 '~' 在某些时候成为一个问题,但我不知道它与引号冲突。谢谢你的提示。 =)
    • 是的,我的初衷是永远不必在 CLASSPATH 中包含特定的库。我想要的是直接在 javac 和 java 中引用 .jar,但是一旦这个配置/makefile 工作我就放弃了。我很快就会再试一次。 =P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多