Web应用程序在Unix服务器中抛出NoClassDefFoundError,而在本地Eclipse中它可以正常工作



我是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文件添加了必要的权限。

希望这对某人有帮助。

最新更新