Makefile с зависимостями Jar и Package - PullRequest
4 голосов
/ 30 марта 2011

Я пытался весь день заставить эту штуку работать.По сути, мне нужно создать make-файл для сборки моего проекта из его источников.Я немного знаю о Linux, но немного, и я полный новичок в makefile.

Я перепробовал множество примеров со всей сети, и все жалуются, что в них отсутствуют зависимости.Другие предлагали использовать Ant или Mavern, но это не возможно, точное уведомление об этом:

Цитируется из спецификации

Ваша заявка должна состоять из одного файлаcomp2010.tar подходит для использования в системе Linux.Он должен содержать файл Makefile и все источники.Вы не должны сдавать никакие файлы .class.Ваш Makefile должен собрать инструмент из источников Java.Основной класс должен называться Blaise.Короче говоря, (автоматический) процесс тестирования будет состоять из:

tar xf comp2010.tar

make

java Blaise < test.file > testout 2> testerr

Эти команды будутвыполняется в пустой директории в стандартной учебной среде Linux с Java 1.6.CLASSPATH будет включать банку ANTLR, версия 3.2.

ПРИМЕЧАНИЕ. Пожалуйста, убедитесь, что ваша заявка может быть скомпилирована и выполнена на стандартных ведомственных машинах.Убедитесь, что вы используете правильную версию Java и не используете абсолютные пути.Если вы используете какие-либо внешние библиотеки, вам также необходимо отправить их.

Таким образом, вы видите, что я не могу установить какие-либо переменные среды, так как машина, на которой она запускается, не моя, и мне не разрешен административный доступ.,Я не могу сдать файлы классов, поэтому make-файл не для меня, и скрипты Ant / Mavern не будут работать, потому что процедура тестирования автоматизирована и использует этот make-файл, и все, что мне разрешено сдавать, это файлы .java.Так что мне нужно собрать make-файл, и этого никак не обойти.

Структура исходного кода выглядит следующим образом:

src \ Package1 * .java

src \Package2 * .java

автоматически сгенерированный \ PackageA * .java

Во всех 3 папках есть исходные файлы, необходимые для компиляции.Метод Main () находится в src \ Package1 \ 1.java

Каждый из этих каталогов является пакетом в Eclipse, и эти 3 пакета зависят друг от друга, а также от внешнего файла Jar antlr-3.2.jar


Итак, как мне сделать этот make-файл.Это мой вопрос, и я предоставил свою собственную попытку ниже:


JAVAC = javac
CLASS_FILES = src/package1/1.class auto-generated/packageA/2.class auto-generated/packageA/3.class auto-generated/packageA/4.class src/Package2/5.class src/Package2/6.class src/Package2/7.class src/Package2/8.class src/Package2/9.class src/Package2/10.class src/Package2/11.class src/Package2/12.class antlr-3.2.jar.*

Default: $(CLASS_FILES)

%.class: %.java
    $(JAVAC) $<

clean: $(RM) *.class

Это терпит неудачу с ошибками типа "org.antlr.runtime не существует", это внутри antlr-3.2.jar.Я нахожусь в конце моего ума и должен сдать в ближайшее время.Я предполагаю, что просто неправильно импортирую банку, и, возможно, мне нужно использовать какой-либо тип CLASSPATH.Извините, если это простой вопрос, но я пытался в течение 6 часов, чтобы сделать один из них.Буду признателен за любую помощь, которую вы можете оказать.

С уважением, Фелдох

Ответы [ 3 ]

4 голосов
/ 30 марта 2011

Я вижу несколько проблем здесь:

  • , как описано, вам нужно настроить класс Blaise в пакете по умолчанию в корневом каталоге файла tar
  • любые пакеты, которые выuse, также должен присутствовать непосредственно в корневом каталоге, а не в исходном подкаталоге (так как Java / Javac не сможет их там найти)
  • make является специфическим в отношении использования пробелов и символов табуляции
  • ваш make-файл не использует опции для команды javac
  • для какой версии make вы пытаетесь создать make-файл?версия, которую я знаю, будет иметь такой формат:

    JAVAC = javac
    JAVACFLAGS =
    SRC= Blaise.java \
        package1/1.java \
        packageA/2.java
    CLS= $(SRC:.java=.class)
    
    all:  $(CLS)
    
    
    .SUFFIXES : .class .java
    .java.class :
        $(JAVAC) $(JAVACFLAGS) $<
    
3 голосов
/ 30 марта 2011

Если вы используете classpath, который не включает в себя текущий каталог, убедитесь, что вы также указали исходный путь.

JAVAC = javac
CLASS_FILES = src/package1/1.class auto-generated/packageA/2.class auto-generated/packageA/3.class auto-generated/packageA/4.class src/Package2/5.class src/Package2/6.class src/Package2/7.class src/Package2/8.class src/Package2/9.class src/Package2/10.class src/Package2/11.class src/Package2/12.class

CLASSPATH = antlr-3.2.jar
SOURCEPATH = .

Default: $(CLASS_FILES)

%.class: %.java
    $(JAVAC) -classpath $(CLASSPATH) -sourcepath $(SOURCEPATH) $<

clean: $(RM) *.class

Альтернативой будет использование пути к классам, который включает в себя текущий каталог (поскольку путь к классам используется, если вы не указали путь к источнику):

CLASSPATH = .:antlr-3.2.jar

%.class: %.java
    $(JAVAC) -classpath $(CLASSPATH) $<

(остальное как указано выше)

Конечно, вы можете добавить опции и к переменной JAVAC.

0 голосов
/ 30 марта 2011

Исправьте ваш вызов javac, добавив antlr в classpath. Я действительно презирал автоматизированные сценарии маркировки, которые использовали мои профессора CS. Они стохастически потерпели неудачу в зависимости от загруженности. Здесь - хорошее введение в Java и Makefiles. По сути, попробуйте создать файлы .java и .class. Используйте JFLAGS для передачи antlr в classpath .

...