- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两台 Ubuntu 20.04 服务器,Alpha 和 Beta,都从标准存储库安装了 Tomcat 9。原则上,它们实际上应该是相同的,但我发现它们各自使用的 Java 版本存在差异,我无法找到其来源。
在服务器 Alpha 上,Tomcat 的 ps
进程列表和 systemctl status tomcat9.service
都显示其 Java 二进制文件是 /usr/lib/jvm/java-8-openjdk-amd64/bin/java
.在服务器 Beta 上,相同的命令显示 Tomcat 的 Java 二进制文件是 /usr/lib/jvm/default-java/bin/java
,它是 /usr/lib/jvm/的符号链接(symbolic link)java-1.11.0-openjdk-amd64/bin/java
.
因此,服务器 Alpha 使用 Java 8,而服务器 Beta 使用 Java 11。它们应该是相同的,但有些地方明显不同。
此时明显的问题是,Tomcat 如何确定使用哪个版本的 Java?
1) 文档
我在 Tomcat configuration documentation 中找不到这个问题的答案,并且文档中没有其他顶级主题似乎与此问题相关。
2) 堆栈溢出
这个堆栈溢出 question是我在网站上能找到的最好的,它没有任何对 Ubuntu 系统有用的答案; /etc/sysconfig/tomcat{N}
在一个答案中被提及,但它在任何一台服务器上都不存在,而 /etc/default/tomcat{N}
存在于两者都有,但不包含任何与 Java 版本相关的参数。
3) 标准配置文件
我还检查了主 Tomcat 配置文件 /var/lib/tomcat9/conf/server.xml
和 Tomcat systemd
服务文件 /lib/systemd/system/tomcat9.service
,但都不包含任何与 Java 版本相关的参数。两台服务器都有一个服务文件覆盖/etc/systemd/system/tomcat9.service.d/override.conf
,但是因为我自己写的,所以我确定它没有设置版本使用 Java。
4) setenv.sh
Tomcat 的 /usr/share/tomcat9/bin/catalina.sh
文件提到了一个 JAVA_HOME
环境变量,我必须假设这就是我要寻找的。该文件似乎希望在它获取两个文件之一时设置此变量,$CATALINA_BASE/bin/setenv.sh
或 $CATALINA_HOME/bin/setenv.sh
。这些文件(或 bin/
目录,甚至)都不存在于任一服务器上,因此这无法解释差异。
这就是我能弄清楚的。问题是:
在没有显式用户配置的情况下,是什么决定了 Tomcat 使用的 Java 版本? 这些信息必须存储在 Tomcat 安装的其中一个文件中,但我无从知晓是哪个文件。
编辑
正如@Emerson Pardo 所建议的,Ubuntu 20.04 的两个实例确实具有不同的默认 Java 版本。但是,在使用 Debian/Ubuntu update-alternatives
程序将 Beta 更改为使用 Java 8 并重新启动 Tomcat 后,上述问题没有发生变化。 Tomcat继续使用
/usr/lib/jvm/default-java/bin/java -> /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java
测试版。
最佳答案
在 Debian 10 的衍生版本上,例如 Ubuntu 20.04,Tomcat 是通过位于 /usr/libexec/tomcat9/tomcat-start.sh
中的包装脚本启动的。如果您不自己设置 JAVA_HOME
,则会在 /usr/libexec/tomcat9/tomcat-locate-java.sh
中执行启发式过程:
# This function sets the variable JDK_DIRS
find_jdks()
{
for java_version in 11 10 9 8
do
for jvmdir in /usr/lib/jvm/java-${java_version}-openjdk-* \
/usr/lib/jvm/jdk-${java_version}-oracle-* \
/usr/lib/jvm/jre-${java_version}-oracle-* \
/usr/lib/jvm/java-${java_version}-oracle \
/usr/lib/jvm/oracle-java${java_version}-jdk-* \
/usr/lib/jvm/oracle-java${java_version}-jre-*
do
if [ -d "${jvmdir}" ]
then
JDK_DIRS="${JDK_DIRS} ${jvmdir}"
fi
done
done
}
# The first existing directory is used for JAVA_HOME
JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks
# Look for the right JVM to use
for jdir in $JDK_DIRS; do
if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then
JAVA_HOME="$jdir"
fi
done
export JAVA_HOME
因此:
/usr/lib/jvm/default-java
存在,则选择它,关于java - 什么决定了在 Ubuntu 上使用哪个版本的 Java Tomcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67941542/
这是一道函数依赖题。 我知道当 x->yz 然后 x->y 和 x->z 时。但是上面的依赖关系可能吗? 最佳答案 If xy determines z can x determine z and y
我有一个奇怪的问题。 Line 61: $this->_currentRoute = Default_Model_Routes::getInstance()->getCurrentRoute(); .
我正在开发一种工具来比较两个波形文件的波形相似性。例如,我有一个持续时间为 1 分钟的波形文件,我使用第一个波形文件制作了另一个波形文件,但每 5 秒生成一次数据,间隔为 5 秒至 0。 现在我的软件
我遇到了一个奇怪的问题,尽管我打赌有一个巧妙的方法可以解决它。 情况是我有一个具有三列排序状态的表:完全未排序,在这种情况下我不希望出现任何图标,按升序排序,在这种情况下我想要一个向上箭头,以及按降序
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
我正在编写一个简单的Bank类,其中包含Account。我希望人员能够开设一个新的受密码保护的银行帐户,并从其帐户中提取和存入资金。账户设在银行内。银行和帐户类应提供哪些服务? 假设 p 已在银行 b
我的标题概括了这一点。我有一个将要开发的简单业务线应用程序,并且很好奇如何确定我应该针对哪个 .NET 版本。支持 Win XP SP3 会很好,但不是必需的。它将用于索引多页 tiff,因此导入一批
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 你是否真的“尝试过”(意味着在其中编程,而不仅仅是阅读有关它的文章)Erlang并决定在项目中
我正在尝试使用 ExceptionFilterAttribute 为 Web Api 实现异常处理。我已经继承了ExceptionFilterAttribute 类并覆盖了onException 方法
前一段时间在一次编程比赛中我遇到了一个令人费解的问题,此后一直困扰着我。虽然我没有逐字记住,但我会尽力重现: Jack starts at 0 on the number line and jumps
我有什么: 我有一个主要内容区域,后面跟着两个旁白: #primary,#secondary,#tertiary{float:left; width:33%;} Primary
我无法正确操作键盘。 整个 View 充满了文本字段。 当我使用通知将 View 向上移动时,上方的文本框不再可见: override func viewDidLoad() { super.v
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我在尝试获取父对象来过滤子事件时遇到问题。 在下面的示例中,我在旋转框上设置了一个事件过滤器。事件过滤器检测旋转框上的鼠标按下事件。然后,我希望父对象根据某些标准接受或忽略该事件。 问题是它似乎接受了
我使用从 std::system_error 继承的类进行错误处理,我想控制调用 what() 时返回的内容。原因:标准(C++11 和 C++1y CD 草案 - N3690,下面的 § 引用是后者
我正在用 Swift 构建一个 iOS 应用程序,它的起始页有 6 个按钮。这些按钮中的每一个都将连接到一个 TableView Controller ,其数据由 NSFetchedResultsCo
我想构建这样的东西 数据存储| mycode.py | RESTful API | mywebapp.py(Django 或 Tornado) 我检查了 Django 的 Piston,但似乎这样我就
究竟如何更改 RichTextBox 中的字体? 环顾四周给了我似乎不再有效的旧答案。我认为这就像执行 richtextbox1.Font = Font.Bold; 或类似操作一样简单。原来不是,所以
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!