细节

细节

ghidra我目前正在尝试在我的 Ubuntu 20.04 机器上安装。安装过程中,我收到以下信息:

******************************************************************
JDK 11+ (64-bit) could not be found and must be manually chosen!
******************************************************************
Enter path to JDK home directory (ENTER for dialog): 

所以,我觉得很酷,然后运行:

sudo apt-get install openjdk-11-jdk

如果我现在运行whereis java

/usr/share/java$ whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz

因此我 cd 到第一个目录,并查看:

/usr/share/java$ ls
commons-logging-1.2.jar           java-atk-wrapper.jar  pdfbox-1.8.16.jar
commons-logging-adapters-1.2.jar  java_defaults.mk      pdfbox.jar
commons-logging-adapters.jar      java_uno.jar          ridl-6.4.7.jar
commons-logging-api-1.2.jar       juh-6.4.7.jar         ridl.jar
commons-logging-api.jar           juh.jar               unoloader-6.4.7.jar
commons-logging.jar               jurt-6.4.7.jar        unoloader.jar
fontbox-1.8.16.jar                jurt.jar
fontbox.jar                       libintl.jar

这里是一堆jar文件吗?一般jdk都有bin文件夹之类的?

我也尝试提供/usr/share/javaghidra 安装,但它抱怨说这不是一个有效的 jdk 主目录,因为它缺少一个bin文件夹。

答案1

首先,通过运行确保安装正确完成java --version,您应该会看到类似以下内容: 在此处输入图片描述

然后,为了找到 jdk 文件夹,运行以下命令:

readlink -f $(which java) 

它返回路径,在我的情况下它返回:

/usr/lib/jvm/java-11-openjdk-amd64/bin/java

您可以运行它ls /usr/lib/jvm/java-11-openjdk-amd64,它会显示 jdk 文件夹内容。它看起来像: 在此处输入图片描述

细节

为什么

首先whereis!就像which不解析符号链接一样!

which java=> 给出命令路径 => 返回一个符号链接

Debian 中的示例:

/usr/bin/java=符号链接到=> /etc/alternatives/java=符号链接到=>/usr/lib/jvm/java-10-openjdk-amd64/bin/java

/usr/lib/jvm/java-10-openjdk-amd64/bin/java是实际的 java 二进制文件!并且/usr/lib/jvm/java-10-openjdk-amd64是 java 主页。

如果你想使用 whereis!你还需要解析符号链接!这里是递归的!

符号链接 => 符号链接 => 实际文件夹或文件

我们可以通过阅读链接来做到这一点

阅读链接

https://man7.org/linux/man-pages/man1/readlink.1.html

https://www.geeksforgeeks.org/readlink-command-in-linux-with-examples/

readlink-打印已解析的符号链接或规范文件名

简而言之!如果你有一个符号链接!

readlink symbolicLink=> 将给出其解析的结果

给定Symlink1 => Symlink2 => path

readllink Symlink1=返回=> 符号链接2

readlink Symlink2=返回=> 路径`

这里我们用java来看一下:

在此处输入图片描述

一个命令

在此处输入图片描述 是啊,太丑了!

还有更好的!使用-f标志

来自帮助文档

 -f, --canonicalize            canonicalize by following every symlink in
                                every component of the given name recursively;
                                all but the last component must exist

所以:

readlink -f $(which java)

递归解析符号链接!

在此处输入图片描述

您也可以通过 whereis 使用它!

在此处输入图片描述

您可以看到并找到您的主目录!

在这个上下文中使用which!比 whereis 更好!

which对于和之间的区别whereis! 让我们使用whatis

$  whatis which
which                (1)  - shows the full path of (shell) commands

$  whatis whereis
whereis              (1)  - locate the binary, source, and manual page files for a command

答案2

由于您之前已经检查过whereis二进制文件是否已安装,
现在您可以检查它是否可以正确执行:

  • 它的位置是否属于你的 PATH 变量?尝试该命令which java,它应该返回类似/usr/bin/java

  • 那么它是一个有效的二进制文件吗?尝试使用命令显示它的版本java -version,它应该显示类似

openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
  • 还请记住,某些 Java 应用程序可能需要设置JAVA_HOME环境变量。然后,您可以将其设置为 Java 安装的主目录,例如JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

为了帮助您检索 java 主路径,您可以使用which java | xargs realpath提供类似路径的路径/usr/lib/jvm/java-11-openjdk-amd64/bin/java(或者您可以ls -l在提供的路径上多次使用which),您需要从中删除最新的部分/bin/java

PS:请注意,如果您的系统需要多个 Java 运行时,则 PATH 解析和 JAVA_HOME 必须与同一版本匹配。
您可以根据需要将任何特定版本解压缩到任何文件夹(如 /my/custom/install/jdk15/)中,并覆盖系统路径:

  export JAVA_HOME=/my/custom/install/jdk15
  export PATH=$JAVA_HOME/bin:$PATH

在我的系统上,我使用如下命令在 .bashrc 中设置 JAVA_HOME:

export JAVA_HOME=`dirname $(dirname $(readlink -f $(which java)))`
export PATH=$JAVA_HOME/bin:$PATH

答案3

whereis和命令的替代方法findlocate命令。它非常快:

$ locate openjdk | head -n10
/home/rick/Android/Sdk/sources/android-28/org/openjdk
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/CollectorOps.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestDataProvider.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestScenario.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/FlagDeclaringOp.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/IntStreamTestDataProvider.java

这些是包含 的前 10 个文件名。您可以使用带有 (line count) 参数的 (word count) 命令openjdk快速定位和统计文件数量:wc-l

$ time locate java | wc -l
57555

real    0m0.945s
user    0m0.927s
sys     0m0.021s

$ time locate openjdk | wc -l
72

real    0m1.053s
user    0m1.033s
sys     0m0.021s

java因此,文件名中有 57,555 个文件,openjdk文件名中有 72 个文件。在这两种情况下,查找所有文件大约需要 1 秒钟。

为了真正体会该命令的速度,locate请考虑搜索哪些文件名包含e字母表中最常见的字母:

$ time locate e | wc -l
2283738

real    0m0.580s
user    0m0.592s
sys     0m0.177s

有 2,228,738 个文件的e文件名中至少出现一次该字母。这是针对三个 Ubuntu 安装、一个 Windows 安装和一个共享的 Ubuntu + Windows 分区。只需半秒钟即可找到它们!

您可能必须locate先安装该命令:

相关内容