ANTLR Ubuntu Java Makefile

Я пытался протестировать простой проект, написанный некоторыми студентами. Я тестирую его на Ubuntu, и проект требует, чтобы я использовал ANTLR и Makefile. Было кошмаром найти конфигурацию make-файла, файлов и папок, которая успешно компилируется и выполняется.

Итак, в основном это настройка папки / файла:

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 (с пакетом labratorios.lab02), который должен быть скомпилирован и на который будет ссылаться файл Main.java.

Проблема возникла при попытке протестировать make-файл на Ubuntu. При каждой конфигурации, которую я пробовал, я продолжал получать ошибки (при компиляции или запуске основного файла java), например:

  • java.lang.NoClassDefFoundError: org / antlr / v4 / runtime / CharStream
  • Не удалось найти или загрузить основной класс org.antlr.v4.Tool
  • Ошибка: не удалось найти или загрузить основной класс

Я выполнил точные шаги из этого руководства, чтобы настроить antlr на моем компьютере: Начало работы с ANTLR v4


person cavpollo    schedule 20.08.2014    source источник


Ответы (1)


После многих неудачных попыток я пришел к этой волшебной конфигурации, которая заставила весь проект работать нормально.

Makefile:

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/*~

Я потребовал, чтобы я установил CLASSPATH в bashrc следующим образом:

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

Как вы найдете в упомянутом мною ранее руководстве (Начало работы с ANTLR v4), в нем говорится, что путь к классам следует писать в кавычках. ПОЛНОСТЬЮ ПРОИГНОРИРУЙТЕ ЭТО СОВЕТ! Всякий раз, когда я использовал кавычки, основной класс не запускался, поскольку ANTLR «отсутствовал». Кроме того, псевдонимы в руководстве не являются обязательными.

Стоит отметить еще кое-что: размещение Makefile в папке labratorio / lab02 / тоже не помогло. Перемещение его и обращение к файлам Java извне помогло ОЧЕНЬ. А символы ".:" Помогли выполнить класс Main, так как он бы сказал, что не может быть найден.

person cavpollo    schedule 20.08.2014
comment
. - это текущий каталог, поэтому .: в вашем CLASSPATH означает включение текущего каталога. Цитаты вокруг пути в задании верны. Ваша проблема в том, что ~ внутри кавычек не расширяется так, как вы хотели (потому что ~ - это особая магия). Так что не используйте это. Вместо этого используйте $HOME и используйте кавычки. - person Etan Reisner; 20.08.2014
comment
Вы также можете использовать $^ в правилах make для обозначения всех предварительных требований. И если вам нужен этот CLASSPATH только для этого make-файла, вы можете установить (и экспортировать) его в make-файле, а не в вашей общей оболочке. - person Etan Reisner; 20.08.2014
comment
Я заметил, что в какой-то момент возникла проблема, но я не знал, что это противоречит кавычкам. Спасибо за совет. знак равно - person cavpollo; 20.08.2014
comment
И да, моим первоначальным намерением было никогда не включать определенные библиотеки в CLASSPATH. Я хотел сослаться на .jar непосредственно в javac и java, но я сдался, как только этот файл конфигурации / makefile заработал. Я скоро попробую еще раз. = P - person cavpollo; 20.08.2014