Реализация log4j не найдена в Fat JarJAVA

Программисты JAVA общаются здесь
Anonymous
Реализация log4j не найдена в Fat Jar

Сообщение Anonymous »

Я уже узнал, как настроить программно настройку log4j, и теперь мне нужно построить «жирную банку», которая включает в себя все зависимости, чтобы программа можно было запустить просто с помощью java -jar example.jar и копировать без необходимости в папке lib рядом с ней.

Код: Выделить всё

$ tree -I '.idea|test|target'
.
├── log.txt
├── pom.xml
└── src
└── main
├── java
│   └── com
│       └── example
│           └── log4j_fat_jar
│               └── Main.java
└── resources
└── META-INF
└── MANIFEST.MF
< /code>
manifest.mf:
Manifest-Version: 1.0
Main-Class: com.example.log4j_fat_jar.Main
< /code>
pom.xml: 


4.0.0

com.example.log4j-fat-jar
log4j-fat-jar
1.0-SNAPSHOT


23
23
UTF-8




org.apache.logging.log4j
log4j-api
3.0.0-beta2



org.apache.logging.log4j
log4j-core
3.0.0-beta2






maven-assembly-plugin
3.7.1


jar-with-dependencies

 

com.example.log4j_fat_jar.Main

${basedir}/src/main/resources/META-INF/MANIFEST.MF




make-assembly
package

single








< /code>
main.java:
package com.example.log4j_fat_jar;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.*;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;

import java.io.File;

public class Main {
private static final Logger LOG = LogManager.getLogger(Main.class);

public static void main(String[] arguments) {
File logFilePath = new File("log.txt");
Main.setLoggingLevel(Level.TRACE, logFilePath);
LOG.info("main(): Hello, World!");
LOG.warn("main(): This is a warning.");
LOG.error("main(): This is an error.");
}

public static void setLoggingLevel(Level level, File logFilePath) {
ConfigurationBuilder  builder = ConfigurationBuilderFactory.newConfigurationBuilder();
final String PATTERN = "%d{ISO8601} %-5p %-9t – %c{1} – %m%n";

LayoutComponentBuilder layout = builder
.newLayout("PatternLayout")
.addAttribute("pattern", PATTERN);

AppenderComponentBuilder consoleAppender = builder
.newAppender("Stdout", "Console")
.addAttribute("target", "SYSTEM_OUT")
.add(layout);

AppenderComponentBuilder fileAppender = builder
.newAppender("File", "File")
.addAttribute("fileName", logFilePath)
.addAttribute("append", true)
.addAttribute("locking", false)
.addAttribute("immediateFlush", true)
.add(layout);

builder.add(consoleAppender);
builder.add(fileAppender);

RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.WARN);
rootLogger.add(builder.newAppenderRef("Stdout"));
rootLogger.add(builder.newAppenderRef("File"));
builder.add(rootLogger);

LoggerComponentBuilder appLogger = builder
.newLogger(Main.class.getPackageName(), level)
.add(builder.newAppenderRef("Stdout"))
.add(builder.newAppenderRef("File"))
.addAttribute("additivity", false);

builder.add(appLogger);
Configurator.initialize(builder.build());
Configurator.reconfigure(builder.build());
LOG.info("Logging level set to {}", level);
}
}
< /code>
Вот вывод командной строки при запуске программы из IntelliJ, используя кнопку зеленого треугольника: < /p>
2025-03-15T21:39:03,233 INFO  main      – Main – Logging level set to TRACE
2025-03-15T21:39:03,256 INFO  main      – Main – main(): Hello, World!
2025-03-15T21:39:03,256 WARN  main      – Main – main(): This is a warning.
2025-03-15T21:39:03,257 ERROR main      – Main – main(): This is an error.
< /code>
Однако при запуске скомпилированного файла JAR из командной строки я получаю эту ошибку: < /p>
$ java -version
openjdk version "23.0.1"  2024-10-15
OpenJDK Runtime Environment Zulu23.30+13-CA (build 23.0.1+11)
OpenJDK 64-Bit Server VM Zulu23.30+13-CA (build 23.0.1+11, mixed mode, sharing)

$ java -jar target/log4j-fat-jar-1.0-SNAPSHOT-jar-with-dependencies.jar
ERROR StatusLogger Exception thrown by constructor for class org.apache.logging.log4j.core.impl.Log4jContextFactory
org.apache.logging.log4j.plugins.di.NotInjectableException: No @Inject constructor or default constructor found for Key[type: org.apache.logging.log4j.core.selector.ContextSelector]
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.createDefaultFactory(DefaultInstanceFactory.java:133)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$getFactory$3(DefaultInstanceFactory.java:111)
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.getFactory(DefaultInstanceFactory.java:111)
at org.apache.logging.log4j.plugins.di.InstanceFactory.getFactory(InstanceFactory.java:82)
at org.apache.logging.log4j.plugins.di.InstanceFactory.getInstance(InstanceFactory.java:104)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.(Log4jContextFactory.java:123)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.(Log4jContextFactory.java:61)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:501)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:485)
at org.apache.logging.log4j.spi.LoggingSystem.tryInstantiate(LoggingSystem.java:251)
at org.apache.logging.log4j.spi.LoggingSystem$SystemProvider.createLoggerContextFactory(LoggingSystem.java:298)
at org.apache.logging.log4j.spi.LoggingSystem.lambda$new$0(LoggingSystem.java:82)
at org.apache.logging.log4j.util.Lazy.lambda$map$0(Lazy.java:39)
at org.apache.logging.log4j.util.LazyUtil$SafeLazy.get(LazyUtil.java:109)
at org.apache.logging.log4j.spi.LoggingSystem.getLoggerContextFactory(LoggingSystem.java:169)
at org.apache.logging.log4j.LogManager.getFactory(LogManager.java:390)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:127)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:554)
at com.example.log4j_fat_jar.Main.(Main.java:13)
ERROR StatusLogger Log4j could not find a logging implementation. Please add log4j-core dependencies to classpath or module path. Using SimpleLogger to log to the console.
Exception in thread "main" java.lang.IllegalArgumentException: Invalid Configuration class specified
at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:219)
at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:182)
at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:68)
at com.example.log4j_fat_jar.Main.setLoggingLevel(Main.java:65)
at com.example.log4j_fat_jar.Main.main(Main.java:17)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:501)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:485)
at org.apache.logging.log4j.core.config.builder.impl.DefaultConfigurationBuilder.build(DefaultConfigurationBuilder.java:194)
...  4 more
Caused by: org.apache.logging.log4j.plugins.di.NotInjectableException: No @Inject constructor or default constructor found for chain Key[type: org.apache.logging.log4j.core.impl.ReusableLogEventFactory] -> Key[type: org.apache.logging.log4j.core.ContextDataInjector]
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.createDefaultFactory(DefaultInstanceFactory.java:133)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$getFactory$3(DefaultInstanceFactory.java:111)
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.getFactory(DefaultInstanceFactory.java:111)
at org.apache.logging.log4j.plugins.di.InstanceFactory.getInstance(InstanceFactory.java:126)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$getArgumentFactory$9(DefaultInstanceFactory.java:211)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$getInjectableInstance$7(DefaultInstanceFactory.java:159)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:636)
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:291)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:656)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:662)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.getInjectableInstance(DefaultInstanceFactory.java:160)
at org.apache.logging.log4j.plugins.di.DefaultInstanceFactory.lambda$createDefaultFactory$6(DefaultInstanceFactory.java:136)
at org.apache.logging.log4j.plugins.di.InstanceFactory.getInstance(InstanceFactory.java:115)
at org.apache.logging.log4j.core.config.LoggerConfig.(LoggerConfig.java:220)
at org.apache.logging.log4j.core.config.AbstractConfiguration.(AbstractConfiguration.java:154)
at org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration.(BuiltConfiguration.java:50)
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
... 7 more
Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/795 ... in-fat-jar

Вернуться в «JAVA»