在使用Apache Tomcat和System.getenv的AWS EC2上,Java应用程序WAR文件无法拾取环境变量

c8ib6hqw  于 2023-01-17  发布在  Apache
关注(0)|答案(1)|浏览(198)

我对这个有点困惑。它在Windows上本地工作,但是当我部署到AWS EC2,安装了Apache Tomcat并配置了环境变量时,它不工作。

java.sql.SQLException: The url cannot be null

这只能来自尝试连接到数据库的代码位,即数据库连接URL为NULL,这意味着.war文件由于某种原因没有通过代码正确获取环境变量;

System.getenv("myEnvVar_databaseConnectionURL");

我能做些什么来调试这里发生的事情呢?看起来应该可以正常工作,但是没有。我的直觉告诉我这是一些奇怪的Linux环境变量,它基于正在运行的用户,例如,某种全局环境变量VS每用户环境变量的东西。但这只是一个猜测,我需要深入了解一点。例如,根环境变量VS {Tomcat用户X待定这是什么}环境变量等。
我可以看到环境变量时,SSH'ing在作为'根'和运行;

printenv | myEnvVar_databaseConnectionURL

然而,当在部署的代码中执行基本命令时,输出是NULL;

System.out.println("URL: " + System.getenv("myEnvVar_databaseConnectionURL"));

这是当我运行命令打印Tomcat输出从AWS EC2;

journalctl -u tomcat -f

在我进一步调查的时候发布这个问题。

sd2nnvve

sd2nnvve1#

在Linux中,环境变量不会在会话之间共享,也不会在用户帐户之间共享。仅仅因为您可以在以root身份登录时看到环境变量,并不意味着以tomcat用户身份运行的tomcat进程可以看到相同的环境变量。如果您在登录时自动看到环境变量,这是因为作为会话创建的一部分,shell执行的脚本之一正在设置这些环境变量。
由于您根本没有提供任何有关如何设置环境变量的细节,我无法指出您做错了什么,也无法更详细地解释您当前的解决方案为什么不起作用。
为Tomcat设置环境变量的最佳解决方案是将它们添加到$CATALINA_BASE/bin/setenv.sh脚本中,其中$CATALINA_BASE在系统中的确切位置取决于所使用的Linux风格(Ubuntu、RedHat等)。

相关问题