Java 启动嵌入式jetty时指定系统属性
我有一个web应用程序,它具有log4j配置。此配置在指定放置日志文件的路径时使用系统属性catalina.home 现在我正在准备集成junit测试套件,该套件加载嵌入式jetty并加载此web应用程序(然后我使用rest调用等进行测试)。我的问题是,由于此web应用程序现在是从jetty catalina加载的。home系统属性没有预先指定,因此日志文件将存储在windows C:/logs/…的根目录中 我需要一种方法来指定从jetty使用的catalina.home。最初我尝试使用:Java 启动嵌入式jetty时指定系统属性,java,web-applications,log4j,jetty,Java,Web Applications,Log4j,Jetty,我有一个web应用程序,它具有log4j配置。此配置在指定放置日志文件的路径时使用系统属性catalina.home 现在我正在准备集成junit测试套件,该套件加载嵌入式jetty并加载此web应用程序(然后我使用rest调用等进行测试)。我的问题是,由于此web应用程序现在是从jetty catalina加载的。home系统属性没有预先指定,因此日志文件将存储在windows C:/logs/…的根目录中 我需要一种方法来指定从jetty使用的catalina.home。最初我尝试使用: S
System.setProperty("catalina.home", "target/jetty/tests/");
但这似乎被忽视了
我不明白为什么上述方法不起作用,以及如何使其起作用。有人能在这里提出建议吗?有人面临过同样的问题吗 日志记录是一种特殊的野兽,它很早就初始化,通常是JVM在应用程序中初始化的第一件事 使用
System.setProperty(“catalina.home”、“target/jetty/tests/”)代码>在这个过程中可能太晚了,因为log4j可能在您设置该属性之前就已经初始化了
为了获得最佳成功,您需要检查以下内容
- 您的测试用例不应该声明静态记录器实例
- 您的
System.setProperty
应该出现在testcase上的静态{}
块中
- 也许出于测试原因,您可以用
src/test/resources
替换(aka override)您的log4j.properties
(或log4j.xml
)文件,并在其中指定其他日志目录路径
奖励:您应该从Gradle或Maven环境中查找并使用${project.basedir}
和${basedir}
系统属性,并使用它们为您的系统.setProperty()
调用创建完全限定的绝对路径,特别是如果您有多模块构建,因为相对路径总是从${user.dir}
(又名PWD)开始,并且这不会随着正常的构建设置而改变
日志记录是一种特殊的野兽,它很早就初始化,通常是JVM在应用程序中初始化的第一件事情之一
使用System.setProperty(“catalina.home”、“target/jetty/tests/”)代码>在这个过程中可能太晚了,因为log4j可能在您设置该属性之前就已经初始化了
为了获得最佳成功,您需要检查以下内容
- 您的测试用例不应该声明静态记录器实例
- 您的
System.setProperty
应该出现在testcase上的静态{}
块中
- 也许出于测试原因,您可以用
src/test/resources
替换(aka override)您的log4j.properties
(或log4j.xml
)文件,并在其中指定其他日志目录路径
奖励:您应该从Gradle或Maven环境中查找并使用${project.basedir}
和${basedir}
系统属性,并使用它们为您的系统.setProperty()
调用创建完全限定的绝对路径,特别是如果您有多模块构建,因为相对路径总是从${user.dir}
(又名PWD)开始,并且这不会随着正常的构建设置而改变
启动junit测试程序时添加-Dcatalina.home=target/jetty/tests/是否有帮助?ramp 1:不幸的是没有。无论哪种方式,我都希望环境是从单元测试编程准备的。您确定Jetty使用的是log4j配置吗?Jetty不直接支持log4j,您可能会看到非log4j输出,并假设生成了它的log4j。我确信,创建的日志文件的名称、相对路径和日志消息模式都是在log4j中指定的。请更正我的预览消息到ramp。我更喜欢以编程方式指定属性。您的-Dcatalina.home=target/jetty/tests/works解决方案。我第一次在intelij环境属性中指定它,而不是在vm选项中指定它。现在再试一次,似乎成功了。我是否可以通过编程的方式来实现这一点?在启动junit测试程序时添加-Dcatalina.home=target/jetty/tests/是否有帮助?ramp 1:不幸的是没有。无论哪种方式,我都希望环境是从单元测试编程准备的。您确定Jetty使用的是log4j配置吗?Jetty不直接支持log4j,您可能会看到非log4j输出,并假设生成了它的log4j。我确信,创建的日志文件的名称、相对路径和日志消息模式都是在log4j中指定的。请更正我的预览消息到ramp。我更喜欢以编程方式指定属性。您的-Dcatalina.home=target/jetty/tests/works解决方案。我第一次在intelij环境属性中指定它,而不是在vm选项中指定它。现在再试一次,似乎成功了。我是否可以通过编程来完成这项工作?src/test/resources替代者工作了。静态块不起作用,不知道为什么,无论哪种方式,我都需要在测试用例中记录日志,所以我更喜欢在测试资源中使用第二个log4j。我从来没有想到log4j会在我启动jetty之前初始化,因为这是我做的第一件事,尽管看起来你是对的。src/test/resources replacemens成功了。静态块不起作用,不知道为什么,无论哪种方式,我都需要在测试用例中记录日志,所以我更喜欢在测试资源中使用第二个log4j。我从来没有想到log4j会在我启动jetty之前初始化,因为这是我做的第一件事,尽管看起来你是对的。