В этом руководстве мы покажем вам, как использовать инструмент сборки Maven для создания единого исполняемого файла Jar и как работать с зависимостями проекта.
Используемые инструменты:
Maven 3.1.1
JDK 1,7
log4j 1.2.17
Джода-тайм 2,5
Затмение 4.3
1. Создайте простой Java-проект
Создайте проект Java из шаблона быстрого запуска Maven.
Вышеуказанной структуры папок недостаточно, создайте файл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 убедитесь, что для упаковки установлено значение «jar». Прочтите комментарий ниже, чтобы не требовать пояснений.
Обновите сгенерированныйApp.java следующим содержанием:
App.java
package com.example.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, но ваши классы не могут вызывать другие классы, которые находятся внутри unpack log4j.jar, Java jar спроектирован таким образом, если вы не создаете специальный загрузчик классов как плагин с одной банкой.
- В качестве альтернативы используйтеmaven-assembly-plugin, чтобы извлечь все jar-файлы зависимостей в необработанные классы и сгруппировать их вместе. Прочтите этоStackOverflow
thread. This hack is workable in project with less dependencies only, for large project with many dependencies, it will cause Java class name conflict issue.
4.2 *Solution* Решение с одной банкой действительно хорошее, но мне не нравятся пользовательский загрузчик классов и концепция толстой банки. Мое самое простое и всегда работающее решение - скопировать все зависимости проекта в заранее определенную папку и определить путь к классам зависимостей в файле манифеста 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.example.core.utils.App).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2014-10-19
Oppss…
5.5 Where is log4j.properties? This is a GOOD practice to exclude the log4j.properties in the jar file, to avoid issues like multiple log4j.properties files in classpath.
Вы все еще можете передать свойства log4j через системное свойствоlog4j.configuration следующим образом:
Note В будущем, если вы захотите переместитьdateUtils.jar, обязательно скопируйте его папкуdependency-jars. Если у вас есть идея получше, поделитесь со мной, спасибо.