Выше структуры папок недостаточно, создайте log4j.properties файл и положить его в src/main/resources/log4j.properties Просто создайте папку ресурсов вручную.
log4j.properties
# Root logger option
log4j.rootLogger=DEBUG, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
Сделайте так, чтобы он поддерживал Eclipse.
$ mvn eclipse:eclipse
И импортирует проект в Eclipse IDE, окончательная структура проекта должна выглядеть следующим образом:
2. Обновите Pom.xml
Обновить pom.xml объявить зависимости log4j и jodatime для вывода в jar формат, убедитесь, что упаковка установлена на «банку». Читайте комментарий ниже для самоочевидности.
Обновить сгенерированный App.java со следующим содержанием:
App.java
package com.csharpcoderr.core.utils;
import org.apache.log4j.Logger;
import org.joda.time.LocalDate;
public class App {
private static final Logger logger = Logger.getLogger(App.class);
public static void main(String[] args) {
System.out.println(getLocalCurrentDate());
}
private static String getLocalCurrentDate() {
if (logger.isDebugEnabled()) {
logger.debug("getLocalCurrentDate() is executed!");
}
LocalDate date = new LocalDate();
return date.toString();
}
}
Теперь этот проект имеет две зависимости: log4j и jodatime.
4. Работа с зависимостями
4.1. Как я могу добавить зависимости в банке?
— Вы можете поместить оба log4j.jar и jodatime.jar в final.jar, но ваши классы не могут вызывать другие классы, которые находятся внутри распакованного log4j.jar, Java-jar спроектирован так, если вы не создадите специальный загрузчик классов как плагин
— В качестве альтернативы, используйте maven-assembly-plugin извлечь все файлы зависимостей в необработанные классы и сгруппировать их вместе. Прочитайте эту ветку StackOverflow . Этот хак работает в проекте только с меньшим количеством зависимостей, для большого проекта с большим количеством зависимостей это вызовет проблему конфликта имен классов Java.
4.2 Решение Решение с одной банкой действительно хорошо, но мне не нравится пользовательский загрузчик классов и концепция толстых банок. Моим самым простым и всегда работающим решением является копирование всех зависимостей проекта в заранее заданную папку и определение пути к классу зависимостей в файле манифеста jar.
Ниже обновленный и окончательный pom.xml , использовать maven-dependency-plugin скопировать все зависимости в target/dependency-jars/ папку и использовать maven-jar-plugin добавить путь к классу зависимостей.
$ java -jar target/dateutils.jar
log4j:WARN No appenders could be found for logger (com.csharpcoderr.core.utils.App).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig для получения дополнительной информации.
2014-10-19
Oppss …
5.5 Где log4j.properties ? Это хорошая практика, чтобы исключить log4j.properties в файле JAR, чтобы избежать проблем, таких как несколько log4j.properties файлы в classpath.
Вы все еще можете передать свойства log4j через log4j.configuration системное свойство как это:
Заметка В будущем, если вы хотите переехать dateUtils.jar , обязательно скопируйте его dependency-jars папка тоже. Если у вас есть идея получше, поделитесь со мной, спасибо.