【问题标题】:Could not read log4j.properties无法读取 log4j.properties
【发布时间】:2019-02-26 05:30:54
【问题描述】:

我们有一个模块,其中包含 log4j.properties 和其他文件。并且有一个独立的模块依赖于第一个模块(重新对齐)。因此,我们将第一个模块制作为 jar 文件并将其放在第二个模块(Reasign)的 WEB-INF/lib 文件夹中。我们正在 Liberty 服务器中运行这些模块。但是我们仍然得到如下的 File Not found 异常,

log4j:ERROR Could not read configuration file
[file:/metlife/runtime/installed/wlp/usr/servers/bobr/apps/expanded/bobr.ear/BOBReassignmentWeb.war/WEB-INF/lib/Realignment.jar!/r_resources/log4j.properties].
[9/12/18 8:28:51:591 EDT] 000002de SystemErr                                                    R java.io.FileNotFoundException: 
file:/metlife/runtime/installed/wlp/usr/servers/bobr/apps/expanded/bobr.ear/BOBReassignmentWeb.war/WEB-INF/lib/Realignment.jar!/r_resources/log4j.properties (No such file or directory) 

【问题讨论】:

  • 您可以尝试使用类加载语义来加载 log4j.properties 而不是将其作为文件加载吗?看起来您正在自动扩展应用程序,但最终会将应用程序文件放在不同的位置 - 对于 Liberty 来说更容易加载,但对于用户来说并不总是很容易找到。我建议禁用自动扩展或通过以下方式查找 log4j.properties 文件: URL url = myAppObject.getClass().getResource("r_resources/log4j.properties"); HTH,安迪
  • PropertyConfigurator.configure(this.getClass().getResource("/r_resources/" + RealignBeans.LOG4J_PROPERTIES).getPath()); System.out.println("******************加载log4j重新对齐****************"+this.getClass( ).getResource("/r_resources/" + RealignBeans.LOG4J_PROPERTIES).getPath()); PropertyConfigurator.configure(this.getClass().getResource("/r_resources/" + RealignBeans.BWLOG_CLIENT_BOB_LCF).getPath()); System.out.println("******************加载log4j重新对齐****************"+this.getClass( ).getResource("/r_resources/" + RealignBeans.BWLOG_CLIENT_BOB_LCF).getPath());
  • 以上是我们当前正在抛出错误的代码
  • 当我们将 autoexpand 属性更改为“false”时,我们会发现所有配置都找不到文件。我们是否可以从 server.xml 中删除 autoexpand 属性?
  • 啊 - 问题是 PropertyConfigurator.configure() 方法有一个字符串参数(配置文件的路径),而不是一个 URL。 URL 会更好,因为它可以处理文件在存档(JAR、WAR、...)中的情况,其中指示文件系统上路径的字符串不能 - 注意“!”在路径中的 Realignment.jar 之后。这表明文件在 jar 中的位置。如果配置器可以接受 URL,则传入从 getResource 返回的 URL。如果没有,您可以考虑将资源放在可以直接在文件系统上读取的共享库中。

标签: log4j websphere-liberty open-liberty


【解决方案1】:

看起来您的PropertiesConfigurator 类正在使用文件路径(作为字符串)。如果您改用 URL,我认为这会起作用 - 这样,您将获得一个 JAR URL,其中包括 JAR(或 WAR、EAR 等)存档的路径和 JAR 内的路径。如果您可以控制 PropertiesConfigurator 代码,那么我建议您更改它,以便它通过 URL 加载文件。

如果这不是一个选项,那么您可以提取属性文件并将它们直接放在文件系统上。例如,您可以在服务器目录中创建一个目录(例如,我们将其命名为log4jProps)。然后你可以像这样在你的服务器配置(server.xml)中创建一个共享库:

<library id="log4j.props">
  <fileset dir="${server.config.dir}/log4jProps" includes="r_resources/*properties"/>
</library>

然后更新您的应用程序配置以将此库用作公共共享库:

<application id="myApp" name="myApp" location="myApp.war"...>
  <classloader commonLibraryRef ="log4j.props" />
</application>

为了更好地衡量,您可能应该从应用程序存档中删除属性文件 - 这样它们就不会从那里加载,然后像现在一样扔掉 PropertiesConfigurator。

希望这会有所帮助, 安迪

【讨论】:

  • log4j 错误已解决安迪。现在我们得到 java.lang.NoClassDefFoundError: org.hibernate.Session。相应的 jar 放在 WEB-INF/lib 文件夹中。但是我们仍然收到此错误。我们也在 MANIFEST.MF 中添加了 jar。但这也是徒劳的
  • 这听起来像是一个单独的问题,所以我建议在 SO 上打开另一个问题。请包含错误的完整堆栈跟踪,并包含包含org.hibernate.Session 的 JAR 名称。在休眠 JAR 缺少依赖项的情况下,查看 WEB-INF/lib 目录中的其他 JAR 文件也可能会有所帮助。 HTH,安迪
猜你喜欢
  • 2017-10-26
  • 2015-11-06
  • 1970-01-01
  • 2021-12-11
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
相关资源
最近更新 更多