У меня есть пакет Utility, в котором нет смысла иметь log4j
в качестве зависимости, однако есть некоторые статические методы, в которых я бы хотел сделать некоторые записи.
Я не хочу делать следующее:
В любом случае я могу вести журнал, не имея регистратора в качестве зависимости от пакета, но он все еще использует log4j, когда он находится в пути к классам.
Вы можете проверить, находится ли log4j в пути к классам со следующим:
Class.forName("org.apache.log4j.Logger");
Если вы возвращаете Class
без исключений, вы можете приступить к созданию регистратора и использовать его.
Вот полный примерный класс, который использует этот подход. Обратите внимание, что вам все еще нужно log4j для компиляции вашего класса, потому что вы ссылаетесь на log4j Logger
но вы можете использовать код с или без log4j в пути к классам.
class YourUtil {
private static final Logger LOGGER;
static {
Class<?> clazz = null;
try {
clazz = Class.forName("org.apache.log4j.Logger");
} catch (ClassNotFoundException e) {}
LOGGER = clazz == null ? null : Logger.getLogger("com.foo.YourUtil");
}
public static void doSomething() {
// To log something:
if (LOGGER != null)
LOGGER.info("Logging using log4j.");
}
}
log4j
в вашем списке «зависимостей», поэтому он будет компилироваться, но он не будет иметь прямой зависимости в конечном jar-ClassLoader
и будет полагаться на тот факт, чтоClassLoader
сможет его найти ...