Tomcat 7:“无法找到 Java Home”

Tomcat 7:“无法找到 Java Home”

Arch Linux。Servlet 显然与 openjdk 存在兼容性问题,因此我卸载了它并从 AUR 安装了普通的 jdk/jre。

# /etc/rc.d/tomcat7 restart
:: Stopping tomcat7 daemon [FAIL] 
:: Starting tomcat7 daemon [BUSY]
Cannot locate Java Home

添加export TOMCAT_JAVA_HOME=/opt/java/etc/profile.d/jdk.sh(和 下的等价物jdk.csh),重新启动。echo $JAVA_HOMEecho $TOMCAT_JAVA_HOME都返回/opt/java,但仍然没有骰子。为什么?

答案1

我按照这个页面解决了这个问题:https://bugs.archlinux.org/task/24126

基本上,您必须在 /etc/rc.d/tomcat7 文件中的“. /etc/conf.d/${daemon_name}”行下方添加这些行

# The JAVA_HOME of the JVM for Tomcat to use

if [ -x /usr/lib/jvm/java-6-openjdk ]; then
TOMCAT_JAVA_HOME=/usr/lib/jvm/java-6-openjdk
elif [ -x /opt/java/ ]; then
TOMCAT_JAVA_HOME=/opt/java/
fi

# Tomcat additional commandline options
CATALINA_OPTS=

希望这可以帮助。

答案2

您需要尝试执行以下操作:

sudo env

绝不能让 root 以“我们”的方式看待环境。

Sudoers 手册有话要说...

由于环境变量可以影响程序行为,sudoers 提供了一种方法来限制要运行的命令从用户环境中继承哪些变量。

... 和 ...

默认情况下,env_reset 选项处于启用状态。这会导致命令在包含 TERM、PATH、HOME、MAIL、SHELL、LOGNAME、USER、USERNAME 和 SUDO_ 变量的最小环境中执行,此外还包含 env_check 和 env_keep 选项允许的调用进程的变量。

我的解决方案是:

# Create a sudoers extension file and authorize passing JAVA_HOME, M2_HOME, etc into new environment
cd ~/
rm -f neededBy*
echo 'Defaults env_keep+="JAVA_HOME M2_HOME CATALINA_HOME TOMCAT_USER"' > neededByTomCat
chmod 0440 neededByTomCat
sudo cp neededByTomCat /etc/sudoers.d/

我希望这有帮助,

哈桑

答案3

在控制台中输入“javac”会得到什么结果吗?它会告诉你是否安装了 JDK 而不仅仅是 JRE。此外,输入命令“which java”可以查看你的 java 链接到哪里。我从不使用 ArchLinux,但在 Ubuntu 和 Mint 上,他们使用替代链接系统来链接默认的 Java 安装……在这种情况下,我在安装 Oracle Java 后使用一个名为“galternatives”的工具来配置它。

我不认为 Arch Linux 像 Ubuntu 那样使用替代系统,但似乎在 .bashrc 中的 PATH 环境变量中添加 java 是可行的方法,而不是不必要地编辑 tomcat 脚本中的 JAVA_HOME 和 CATALINA_HOME 环境变量(因为脚本应该能够根据 java 二进制文件的位置自动确定这些变量)。

答案4

打开catalina.sh并在第一行代码之前添加以下几行(但当然在 shebang 下方)

JAVA_HOME=/opt/java
JRE_HOME=/opt/java/jre

调整路径以满足您的需要。无需操作任何 PATH 或持久变量即可使 Tomcat 正常工作。

相关内容