我有一个Java应用程序(=launcher(,它通过自定义ClassLoader加载类。在我启动的应用程序和启动器中,我使用带有自定义XML配置的log4j2
。
在发射器中:
private static final Logger LOGGER;
static
{
loadLog4jConfiguration(ApplicationLauncherClient.class);
LOGGER = getLogger();
}
loadLog4jConfiguration()
的实现方式如下:
public static void loadLog4jConfiguration(final Class<?> clazz)
{
try
{
String resourceName = "launcher-log4j2.xml";
try (InputStream inputStream = clazz.getResourceAsStream(resourceName))
{
if (inputStream == null)
{
System.err.println("Cannot find resource: " + resourceName);
} else
{
ConfigurationSource configurationSource = new ConfigurationSource(inputStream);
Configurator.initialize(null, configurationSource);
}
}
} catch (final Exception exception)
{
exception.printStackTrace();
}
}
在启动的应用程序中,我对log4j2
进行了相同的设置,但我从类路径加载了一个*不同的*log4j2.xml
文件(例如,提供日志消息的JTextArea
附件(。
不幸的是,JTextArea
日志在自定义类加载时不起作用。然而,当我正常启动应用程序(例如通过IDE(时,它们就可以工作了。我认为log4j2
实例之间存在某种冲突。启动器和启动的应用程序具有log4j2
maven依赖关系。我该如何干净地解决这个问题?我不想从启动器中完全删除log4j2
。我想过可能总是在启动的应用程序上向getLogger()
构造函数传递一个类实例,但这也没有帮助。我在启动的应用程序上打印出了LOGGER
实例的ClassLoader
,在这两种情况下(当自定义类加载时和通过IDE正常启动时(,它都显示sun.misc.Launcher$AppClassLoader
,所以现在我不确定还能尝试什么。
尝试使用Configurator.reconfigure(URI)