我是web应用程序部署及相关工作的新手。我有一个简单的maven web应用程序,它在我的Eclipse&Tomcat9服务器。应用程序有jsp文件和main类,两者都试图调用log4j2类,如Logger或LogManager:
<% Logger.getLogger("bla").toString()%>
或者主要是:
private statis final Logger logger = LogManager.getLogger("blablabla");
此外,我在这些类上调用getPath()
方法,它们会向我显示我的本地maven存储库。
在Unix服务器上部署它之后,我在浏览器中得到了NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.status.StatusLogger
,如果我再次尝试调用它,我总是会得到一些不同:NoClassDefFoundError: Could not initialize class org.apache.log4j.LogManager
试图通过PuTTY执行主类,我得到了同样的结果,然而,在设置了一个export CLASSPATH=$CLASSPATH:./WEB-INF/lib/*
到带有程序库的路径后,控制台中显示的环境CLASSPATH与我之前设置的完全一样,但仍然不通过浏览器作为web应用程序工作。
我试着通过上面的命令(startup.sh\setenv.sh等(设置CLASSPATH,但没有。命令...catalina.sh version
向我显示了一个CLASSPATH,但应用程序仍然无法工作。如上所述,我只能在手动设置CLASSPATH后在PuTTY中运行主类。
我已经没有什么想法了,也许你们可以给我一些建议;暗示?也许每次启动应用程序时都会有一些脚本来设置它。不幸的是,我无法附加一些代码。
问题与SecurityManager有关,它在我的本地上关闭,而在服务器上打开。首先,我在本地模拟了这个问题,然后我发现卸载SecurityManager时错过了哪些权限。然后,我在运行conf中添加了一个VM参数-Djava.security.debug=access,failure
。请小心,因为控制台中有大量输出,最好将其记录在外部txt文件中。在那之后,我浏览了log.txt,搜索了一个单词,比如";拒绝\失败\失败";并向catalina.policy文件添加了必要的权限。
希望这对某人有帮助。