Включение файла внутреннего класса java в JAR с использованием GNU make - PullRequest
4 голосов
/ 20 февраля 2012

У меня есть проект Java, который использует GNU make для компиляции исходных файлов, а также для создания JAR. После того, как я ввел вложенное перечисление, создается новый файл main_classname$inner_classname.class.

У меня проблемы с включением этого файла в JAR.

Ниже приведена соответствующая часть моего Makefile:

JARNAME=Project.jar

CLASSES=\
   Main.class \
   Main$$Inner.class

И это отрывок из файла target , который включен в Makefile:

$(JARNAME): $(CLASSES)
   jar cvf $(JARNAME) $(CLASSES)

Внутренний класс не добавляется в JAR, поскольку оболочка расширяет строку после знака доллара.

Я пытался поставить обратную косую черту перед $$, то есть Main\$$Inner.class, но жаловался:

make: * Нет правил для создания цели Main\$Inner.class', needed by Project.jar '. Стоп.

Другой подход состоял в том, чтобы попробовать следующее изменение, чтобы избежать доллара, но безрезультатно:

ESCAPED_CLASSES=$(patsubst %$$,%\$$,$(CLASSES))
$(JARNAME): $(CLASSES)
   jar cvf $(JARNAME) $(ESCAPED_CLASSES)

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

Ответы [ 4 ]

2 голосов
/ 20 февраля 2012

(не проверено)

Если вы не можете просто использовать подстановочный знак для всех файлов классов, чтобы получить имена файлов, но вам нужно указать его явно, вы должны указать Make, что ваши знаки доллара равны знаки доллара!

Это в Make, сделав экранирование с другим знаком доллара.From http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

Поскольку знаки доллара используются для начала создания ссылок на переменные, если вы действительно хотите, чтобы знак доллара указывался в качестве цели или предпосылки, вы должны написать два из них, $$ (см. Раздел КакИспользовать переменные).Если вы включили вторичное расширение (см. Вторичное расширение) и хотите, чтобы в списке предварительных условий был буквальный знак доллара, вы должны написать четыре знака доллара ('$$$$').

В этомЕсли вы хотите два настоящие знаки доллара.В соответствии с этим это означает четыре или даже восемь знаков доллара в Makefile.

1 голос
/ 10 декабря 2013

Вы были почти там. Я использую $ (subst $$, \ $$, $ (CLASSES)) и удваиваю доллары (как вы сделали).

Этот сборочный файл GNU работает для меня:

JAR     =       /usr/bin/jar
CLASSES = org/apache/commons/csv/CSVParser$$Token.class

executable: poo.jar

poo.jar:      $(CLASSES)
    $(JAR) cvf $@ $(subst $$,\$$,$(CLASSES))
1 голос
/ 22 февраля 2012

Ваша идея использовать $(patsubst) кажется обоснованной, но я думаю, что вы называете это неправильно.Вы пробовали:

ESCAPED_CLASSES := $(patsubst $$,\$$,$(CLASSES))

Обратите внимание, что вы должны использовать := вместо =, или вы будете тратить много времени на переоценку $(patsubst) каждый раз, когда $(ESCAPED_CLASSES) расширяется.

0 голосов
/ 25 февраля 2012

Вот так я наконец решил проблему, хотя надеюсь, что найдется лучший ответ. Или, может быть, я должен прекратить использовать make для проектов Java.

Я определил новую переменную в Makefile , и теперь она выглядит так:

JARNAME=Project.jar

CLASSES=\
   Main.class\
   Main$$Inner.class

ESCAPED_CLASSES=\
   Main.class\
   Main\$$Inner.class

Поскольку ESCAPED_CLASSES не обязательно определяется всеми Makefiles , использующими файл цели , я обработал это следующим образом, чтобы сохранить правила в целях универсальный файл:

ESCAPED_CLASSES ?= $(CLASSES)

$(JARNAME): $(CLASSES)
   jar cvf $(JARNAME) $(ESCAPED_CLASSES)

?= будет гарантировать, что присвоение будет иметь место, только если переменная еще не определена - GNU сделает руководство, описывающее оператор условного присвоения переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...