我如何找到哪个包提供了“javac”?

我如何找到哪个包提供了“javac”?

我想找到 Ubuntu 14.04(服务器)上安装了哪个软件包可以访问该javac命令。RHEL 系列发行版有yum provides这个功能,但 Debian 系列似乎没有类似功能。

AskUbuntu 问题建议使用dpkg -Sapt-file,但是这些都不起作用:

$ sudo dpkg -S `which javac`
dpkg-query: no path found matching pattern /usr/bin/javac

apt-file search乍一看似乎有效:

$ apt-file search javac
javacc: /usr/bin/javacc

但这apt-cache policy表明这个包甚至没有安装,所以它显然不是提供的包javac

$ apt-cache policy javacc
javacc:
  Installed: (none)
  Candidate: 5.0-5

我如何才能找出哪个包提供了该javac命令?

答案1

在某些情况下,需要进行额外的侦查。特别是,

$ ls -l $(which javac)
lrwxrwxrwx 1 root root 23 May 24  2017 /usr/bin/javac -> /etc/alternatives/javac

显示这/usr/bin/javac是一个符号链接 - 因此我们可以使用readlink来深入研究:

$ dpkg -S "$(readlink -f $(which javac))"
openjdk-8-jdk-headless:amd64: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

或(看作是一个update-alternatives链接)

$ update-alternatives --query javac
Name: javac
Link: /usr/bin/javac
Slaves:
 javac.1.gz /usr/share/man/man1/javac.1.gz
Status: auto
Best: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
Value: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

Alternative: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
Priority: 1081
Slaves:
 javac.1.gz /usr/lib/jvm/java-8-openjdk-amd64/man/man1/javac.1.gz

从中我们可以选出当前值:

$ dpkg -S /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
openjdk-8-jdk-headless:amd64: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

答案2

看起来像是/usr/bin/javac由 管理的符号链接update-alternatives。如果你 ,你看到了什么readlink -f /usr/bin/javac?如果它指向其他地方,也许可以检查位置与dpkg -S? 或者update-alternatives它本身可以告诉您对于特定链接有哪些选项,例如:

$ update-alternatives --config javac
There is only one alternative in link group javac (providing /usr/bin/javac): /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
Nothing to configure.

那么:

$ dpkg -S /usr/lib/jvm/java-8-openjdk-amd64/bin/javac
openjdk-8-jdk-headless:amd64: /usr/lib/jvm/java-8-openjdk-amd64/bin/javac

该包中的所有文件:https://packages.ubuntu.com/xenial/openjdk-8-jdk-headless/filelist

相关内容