В некоторых случаях может быть недостаток слова static
:
final static Logger logging = Logger.getLogger(ProcessorTest.class);
Если я сделаю регистратор полем экземпляра, я получаю именно это предупреждение:
No appenders could be found for logger (org.apache.kafka.producer.Sender)
Что еще хуже, предупреждение указывает не на ProcessorTest
, где находится ошибка, а на совершенно другой класс (Отправитель) в качестве источника проблем. Класс имеет правильный регистратор заданий и не нуждается в каких-либо изменениях! Мы могли бы искать проблему на века!
Хорошо, вот мое собственное решение, которое является, к сожалению, не на основе кода состояния collect_sources.py сценария, но какие Работы Для Me(TM) и позволяет мне видеть любой вывод, который производит сценарий:
SHELL_OUTPUT := $(shell python collect_sources.py 2>&1)
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),)
$(info $(SHELL_OUTPUT))
else
$(error $(SHELL_OUTPUT))
endif
сценарий записан так, чтобы любая ошибка произвела вывод, начинающийся "collect_sources: error:"
. Кроме того, если Python не может найти или выполнить данный сценарий, он производит сообщение об ошибке, содержащее сообщение "[Errno 2]"
или подобный. Таким образом, этот маленький кусочек кода просто получает вывод (перенаправляющий stderr к stdout) и ищет сообщения об ошибках. Если ни один не найден, это просто использует $(info)
для печати вывода, иначе это использует $(error)
, который эффективно делает, Делают остановку.
Примечание, что добавление отступа в эти ifeq ... endif
сделано с пробелами. Если вкладки используются, Сделайте, думает, что Вы пытаетесь вызвать команду, и жалуется на это.
Мог бы быть лучший путь, но я попробовал следующее, и он работает:
$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))
Здесь я предполагал, что your_command
не дает вывода, но не должно быть трудно работать вокруг такой ситуации.
Редактирование: Чтобы заставить его работать с оболочкой Windows по умолчанию (и вероятно любой достойной оболочкой), Вы могли записать your_command && echo ok
вместо if
в эти shell
функция. Я не думаю, что это возможно для (более старых) оболочек DOS. Для них Вы, вероятно, хотите адаптировать your_command
или записать сценарий обертки для печати чего-то на ошибке (или успех).
Необходимо использовать регулярную цель для создания BuildRules.mk:
BuildRules.mk: collect_sources.py
python $< >$@
include BuildRules.mk
Это - стандартный прием для использования при автоматической генерации зависимостей.
Удостоверьтесь, что Вы не вызываете make/gmake с-k опцией.