Vaadin应用部署到生产Tomcat后连接Domino服务器报NoClassDefFoundError
解决Vaadin 8应用部署到生产Tomcat后无法加载
lotus/domino/local/Session的问题 这个问题我帮团队排查过好几次,核心是Domino本地类加载的环境依赖问题——虽然你已经放了NCOS.jar,但生产环境和本地开发环境的差异很容易导致类加载失败。咱们一步步来拆解排查:
1. 先确认NCOS.jar的位置与权限
- 本地Eclipse里可能随手把jar放在WEB-INF/lib或者Tomcat全局lib都能跑,但生产环境要严格规范:如果只是当前应用需要Domino依赖,必须把NCOS.jar放在应用的
WEB-INF/lib目录下,不要丢到Tomcat的$CATALINA_HOME/lib(全局lib容易和其他应用的依赖冲突)。 - 还要检查生产服务器上这个jar的文件权限:Linux下要确保Tomcat进程能读取它(执行
chmod 644 NCOS.jar),Windows下不要设置为只读属性。
2. 生产服务器必须安装完整的Lotus Notes客户端
lotus.domino.local.Session是本地Domino客户端的类,NCOS.jar只是上层封装,它依赖本地安装的Notes客户端原生库(Windows下的nnotes.dll、Linux下的libnotes.so)。
- 生产服务器要安装和本地版本一致的Lotus Notes 9.x完整客户端(不要只拷jar包,原生库是必须的)。
- 配置环境变量让Tomcat能找到原生库:
- Windows:把Notes安装目录(比如
C:\Program Files\IBM\Lotus\Notes)加入系统PATH - Linux:在Tomcat启动脚本里指定
-Djava.library.path=/opt/ibm/lotus/notes/lib,或者把该路径加入LD_LIBRARY_PATH
- Windows:把Notes安装目录(比如
3. 排查Tomcat类加载冲突
如果生产Tomcat的全局$CATALINA_HOME/lib目录里存在旧版本的Domino相关jar(比如lotus.domino.jar),会和你应用WEB-INF/lib里的NCOS.jar发生类加载冲突。直接删掉全局lib里的Domino相关jar,让应用优先加载自己的依赖。
4. 验证war包打包完整性
有时候Eclipse导出war包时,可能漏了NCOS.jar。手动解压生产环境的war包,检查WEB-INF/lib下是否有这个jar,并且文件大小和本地的一致(避免传输过程中损坏)。
5. 给Tomcat启动添加Domino专属系统参数
本地Eclipse会自动读取Notes的配置,但生产Tomcat不会,必须手动指定:
- 在Linux/Mac的
catalina.sh里添加:CATALINA_OPTS="$CATALINA_OPTS -Dnotes.ini=/opt/ibm/lotus/notes/notes.ini" CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/opt/ibm/lotus/notes/lib" - 在Windows的
catalina.bat里添加:set CATALINA_OPTS=%CATALINA_OPTS% -Dnotes.ini=C:\Program Files\IBM\Lotus\Notes\notes.ini set CATALINA_OPTS=%CATALINA_OPTS% -Djava.library.path=C:\Program Files\IBM\Lotus\Notes
我之前遇到的类似问题,80%都是生产服务器没装Notes客户端或者环境变量没配置对,你可以先从这两点入手排查。如果还是不行,去Tomcat的localhost.log里找更详细的错误栈——如果有UnsatisfiedLinkError,那就是原生库没加载成功,重点检查java.library.path的配置。
内容的提问来源于stack exchange,提问作者Bitwyse1
相关产品推荐
相关产品推荐

