【问题标题】:Specifying system property when starting embedded jetty启动嵌入式码头时指定系统属性
【发布时间】:2015-12-10 10:38:34
【问题描述】:

我有一个具有 log4j 配置的网络应用程序。此配置在指定要放置日志文件的路径时使用系统属性 catalina.home

现在我正在准备集成 junit 测试套件,该套件会加载 嵌入式码头 并加载此 Web 应用程序(然后我使用 rest 调用等进行测试)。我的问题是,由于这个 web 应用程序现在是从码头加载的 catalina.home 系统属性没有预先指定使日志文件存储在 windows C:/logs 的根目录中/...

我需要一种方法来指定要从码头使用的 catalina.home。最初我尝试使用:

System.setProperty("catalina.home", "target/jetty/tests/");

但这似乎被忽略了。

我无法弄清楚为什么上述方法不起作用以及如何使其起作用。任何人都可以在这里提出一些建议吗?有没有人遇到过同样的问题?

【问题讨论】:

  • 启动 junit 测试程序时添加 -Dcatalina.home=target/jetty/tests/ 有帮助吗?
  • 斜坡 1:不幸的是没有。无论哪种方式,我都希望以编程方式从单元测试中准备环境
  • 您确定 Jetty 正在使用该 log4j 配置吗? Jetty 没有直接支持 log4j,您可能会看到非 log4j 输出并假设它生成了 log4j。
  • 我确定,创建的日志文件的名称、相对路径和日志消息模式都是在 log4j 中指定的。
  • 对我的预览消息进行更正以提升。我更喜欢以编程方式指定属性。您的 -Dcatalina.home=target/jetty/tests/ 解决方案有效。我第一次在 intelij environmnet 属性而不是 vm 选项中指定它。现在再次尝试,这似乎可以解决问题。我可以以编程方式执行此操作吗?

标签: java web-applications log4j jetty


【解决方案1】:

日志记录是一种特殊的野兽,它很早就初始化,通常是 JVM 在您的应用程序中初始化的第一件事。

您在此过程中使用System.setProperty("catalina.home", "target/jetty/tests/"); 可能为时已晚,因为在您设置该属性之前,log4j 可能已经初始化。

为了获得最大的成功,您需要检查以下...

  • 您的测试用例不应声明静态 Logger 实例
  • 您的System.setProperty 应该出现在测试用例的static { } 块中
  • 也许您可以出于测试原因使用src/test/resources 替换(也称为覆盖)您的log4j.properties(或log4j.xml)文件,并在其中指定替代日志目录路径。

奖励:您应该从 Gradle 或 Maven 环境中寻找并使用 ${project.basedir}${basedir} 系统属性,并使用它们为您的 System.setProperty() 创建完全合格的绝对路径调用,特别是如果您有一个多模块构建,因为相对路径将始终来自 ${user.dir}(又名 PWD),并且不会随着正常的构建设置而改变。

【讨论】:

  • src/test/resources replacemen 工作。静态块不起作用,不知道为什么,无论哪种方式我都需要在我的测试用例中登录,所以我更喜欢在测试资源中使用第二个 log4j。我从来没有想过 log4j 会在我启动码头之前初始化,因为这是我做的第一件事,尽管你似乎是对的。
猜你喜欢
  • 2014-09-17
  • 2010-09-27
  • 2014-09-25
  • 2011-01-31
  • 2011-09-05
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多