【问题标题】:Why are most command-line CLASSPATHs ignored by Mac OS Java 14?为什么 Mac OS Java 14 忽略了大多数命令行 CLASSPATH?
【发布时间】:2020-11-29 00:35:32
【问题描述】:

我正在尝试在 Mac OS Catalina (10.15.7) 的命令行中运行 Java。在 Ubuntu 18.04.5 下一切正常,但在 Mac OS 下失败。以下是规格:

Mac OS Catalina (10.15.7):

$java --version
java 14 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)

Ubuntu 18.04.5:

$java --version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-46)
OpenJDK 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)

我在 Ubuntu 下使用的 Java 只是 OpenJDK Java 14,而我在 Mac 下使用的 Java 似乎是 macOS 附带的任何 Java 14 风格。如果我尝试从 Ubuntu 18 的命令行运行标准的 HelloWorld.java,一切正常:

public class HelloWorld {
    public static void main (String [] args) {
        System.out.println("Hello, World!");
    }
}

编译:

$javac ./HelloWorld.java

运行:

$java HelloWorld
Hello, World!

使用-cp 明确指定CLASSPATH 也可以:

$java -cp /home/anton/Desktop HelloWorld
Hello, World!

然而,以上在 Mac OS 的命令行上完全失败:

$java HelloWorld
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
$java -cp /Users/anton/Desktop HelloWorld
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld

据我所知,在 Mac OS 上解决此问题的唯一方法是将 HelloWorld.class 文件复制到 /Library/Java/Extensions 文件夹。 然后,一切都按预期工作,只要 CLASSPATH 设置得当:

$sudo cp ./HelloWorld.class /Library/Java/Extensions/
$java -cp /Library/Java/Extensions HelloWorld
Hello, World!

问题:

  1. 是否有一种干净的方法让 Mac OS Java 14 接受 /Library/Java/Extensions 之外的文件的 -cp <CLASSPATH> 设置?
  2. 如果对 1) 的回答为“否”,是否有可在 Mac OS 命令行上使用的推荐替代 Java 安装?

谢谢!

【问题讨论】:

  • 现代 macOS 没有 java。你一定是自己安装的。
  • 我的理解是 all Java 实现以相同的方式处理-cp。因此,您所看到的是由于 Java 在您的 Mac 上的安装方式或您使用它的方式。不幸的是,我们无法“深入了解”您的 Mac 找出真正的原因。

标签: java macos command-line classpath


【解决方案1】:

我刚刚在我的 Mac 上做了一个快速测试:

ravn@freewifi z % java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment (build 14+36-1461)
OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
ravn@freewifi z % javac HelloWorld.java
ravn@freewifi z % java HelloWorld
Hello, World!
ravn@freewifi z % type java
java is /usr/bin/java
ravn@freewifi z % /usr/libexec/java_home -V
Matching Java Virtual Machines (6):
    14 (x86_64) "Oracle Corporation" - "OpenJDK 14" /Users/ravn/Library/Java/JavaVirtualMachines/openjdk-14/Contents/Home
...
ravn@freewifi z % 

看起来您的 Java 是 Oracle JVM,而我的 Java 和您的 Ubuntu Java 是 OpenJDK JVM,这可以解释它。可能要调查的事情:您有 CLASSPATH 变量吗?您的java 命令是否指向系统二进制文件?是否正确配置到合适的 JVM?

【讨论】:

  • 谢谢托尔比约恩。我的 Mac 上导致此问题的 Java 位于:/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home/bin/java 我查看了 /usr/bin/java,它已被以下链接覆盖:/usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java 这两个 Java 都显示相同的行为关于类路径。也许你是对的 - OpenJDK Java 可能是唯一的方法。我试试看。
  • @sabinc_777 不,您需要查看您的 java 命令指向的位置,而不是指向的位置,因为您可能在此过程中错误配置了某些内容(如果您在不确切知道的情况下设置了 PATH 变量例如你在做什么)。
  • 抱歉输入太快 - 请参阅上面的编辑
  • 请注意,我的系统按照您的预期工作(我已经完成了相当多的 Java 开发,所以我很确定它安装正确)。因此这是可能的——现在你只需要找出你在哪里弄坏了东西。
  • @Thornbjorn 我认为情况正在变得更加清晰。 /System/Library/Frameworks/JavaVM.framework/.../java 中的 Java 显示相同的奇怪类路径行为,在 Java Development Guide for Mac 中明确提到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多