Домой java Как создать файл JAR с Maven

Как создать файл JAR с Maven

368
0

В этом уроке мы покажем вам, как использовать инструмент сборки Maven, чтобы создать один исполняемый файл Jar и как работать с зависимостями проекта.

Используемые инструменты:

  1. Maven 3.1.1
  2. JDK 1,7
  3. log4j 1.2.17
  4. Йода-время 2,5
  5. Затмение 4.3

1. Создайте простой Java-проект

Создайте проект Java из шаблона быстрого запуска Maven.


$ mvn archetype:generate -DgroupId=com.csharpcoderr.core.utils -DartifactId=dateUtils
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Будут созданы следующие файлы и структура папок.


.
|____dateUtils
| |____pom.xml
| |____src
| | |____main
| | | |____java
| | | | |____com
| | | | | |____mkyong
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____App.java
| | |____test
| | | |____java
| | | | |____com
| | | | | |____mkyong
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____AppTest.java

Выше структуры папок недостаточно, создайте 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 формат, убедитесь, что упаковка установлена на «банку». Читайте комментарий ниже для самоочевидности.

pom.xml



4.0.0
com.csharpcoderr.core.utils
dateUtils


jar

1.0-SNAPSHOT
dateUtils
http://maven.apache.org 


1.7
2.5
4.11
1.2.17




junit
junit
${junit.version}
test


joda-time
joda-time
${jodatime.version}


log4j
log4j
${log4j.version}




dateutils




org.apache.maven.plugins
maven-eclipse-plugin
2.9

true
false





org.apache.maven.plugins
maven-compiler-plugin
2.3.2

${jdk.version}
${jdk.version}





org.apache.maven.plugins
maven-jar-plugin



**/log4j.properties




com.csharpcoderr.core.utils.App









3. Обновите App.java

Обновить сгенерированный 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.

— Попробуйте плагин one-jar , он создаст fat-jar, который включает в себя все зависимости проекта в одном файле jar, прочитайте эту статью — Создайте толстый файл Jar с Maven

4.2 Решение
Решение с одной банкой действительно хорошо, но мне не нравится пользовательский загрузчик классов и концепция толстых банок. Моим самым простым и всегда работающим решением является копирование всех зависимостей проекта в заранее заданную папку и определение пути к классу зависимостей в файле манифеста jar.

Ниже обновленный и окончательный pom.xml , использовать maven-dependency-plugin скопировать все зависимости в target/dependency-jars/ папку и использовать maven-jar-plugin добавить путь к классу зависимостей.

pom.xml



4.0.0
com.csharpcoderr.core.utils
dateUtils
jar
1.0-SNAPSHOT
dateUtils
http://maven.apache.org 


1.7
2.5
4.11
1.2.17




junit
junit
${junit.version}
test


joda-time
joda-time
${jodatime.version}


log4j
log4j
${log4j.version}




dateutils




org.apache.maven.plugins
maven-eclipse-plugin
2.9

true
false





org.apache.maven.plugins
maven-compiler-plugin
2.3.2

${jdk.version}
${jdk.version}





org.apache.maven.plugins
maven-jar-plugin


**/log4j.properties



true
com.csharpcoderr.core.utils.App
dependency-jars/







org.apache.maven.plugins
maven-dependency-plugin
2.5.1


copy-dependencies
package

copy-dependencies



runtime
${project.build.directory}/dependency-jars/









5. Окончательный файл Jar

5.1 Упакуйте проект.


$ mvn package

Просмотрите структуру папок в целевой папке

dateutils.jar создается, и все зависимости времени выполнения проекта (исключая junit) копируются в target/dependency-jars/ папка.

5.2 Перечислите dateutils.jar содержание:


$ jar tf target/dateutils.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/mkyong/
com/mkyong/core/
com/mkyong/core/utils/
com/mkyong/core/utils/App.class
META-INF/maven/
META-INF/maven/com.csharpcoderr.core.utils/
META-INF/maven/com.csharpcoderr.core.utils/dateUtils/
META-INF/maven/com.csharpcoderr.core.utils/dateUtils/pom.xml
META-INF/maven/com.csharpcoderr.core.utils/dateUtils/pom.properties

5.3 Извлекает и просматривает содержание MANIFEST.MF , зависимости добавляются в Class-Path ,

META_INF / MANIFEST.MF


Manifest-Version: 1.0
Built-By: mkyong
Build-Jdk: 1.7.0_05
Class-Path: dependency-jars/joda-time-2.5.jar dependency-jars/log4j-1.2.17.jar
Created-By: Apache Maven 3.1.1
Main-Class: com.csharpcoderr.core.utils.App
Archiver-Version: Plexus Archiver

5.4 Запустите его


$ 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 системное свойство как это:


$ java -jar -Dlog4j.configuration=file:/full_path/log4j.properties target/dateutils.jar

17:09:15,385 DEBUG App:18 - getLocalCurrentDate() is executed!
2014-10-19

Заметка
В будущем, если вы хотите переехать dateUtils.jar , обязательно скопируйте его dependency-jars папка тоже. Если у вас есть идея получше, поделитесь со мной, спасибо.

Готово.

Скачать исходный код

Загрузить — maven-create-a-jar.zip (7 КБ)

Рекомендации

  1. Зависимость: Тетради зависимости
  2. Официальная страница Maven-архетип-плагин.
  3. Как сделать исполняемый файл JAR
  4. One-JAR
  5. Maven — исключить log4j.properties в файле Jar
  6. Maven — создание толстого файла Jar — пример One-JAR

баночка мавен

Как создать файл JAR с Maven

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Java - Как преобразовать Char Array в строку

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь