在 Windows 8.1 上,“javac -version”有效,但 Cordova 无法识别

Posted

技术标签:

【中文标题】在 Windows 8.1 上,“javac -version”有效,但 Cordova 无法识别【英文标题】:On Windows 8.1 "javac -version" works but Cordova doesn't recognize it 【发布时间】:2018-09-05 04:29:48 【问题描述】:

我正在尝试设置 Cordova。当我运行cordova build android 时,我收到以下错误:

(node:6816) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Failed to run "javac -version", make sure that you have a JDK installed.
You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.
Your JAVA_HOME is invalid: C:\Program Files\Java\jdk1.8.0_161;C:\Program Files\Java\jdk1.8.0_161\bin

但是我可以运行 javac -version 就好了。

C:\>javac -version
javac 1.8.0_161

我尝试以各种方式设置JAVA_HOME:指向根;指向bin 文件夹;将其设置为用户变量和系统变量;将%JAVA_HOME%\bin 添加到Path(用于用户和系统)等等。

我查看了几篇关于这个问题的文章,他们说如果我能够使用javac -version,那么这应该表明我的环境变量设置正确。即使是这样,科尔多瓦似乎仍然没有认出来。

更新

按照 Stephen C 的说明,我已重置变量,但我的错误仍然存​​在。正如您在图像中看到的,我可以调用 javac 就好了,JAVA_HOMEPath 似乎都以正确的方式设置。 (注意实际上是%JAVA_HOME%\bin 而不是Path 中的C:\Program Files\Java\jdk1.8.0_161\bin。)

【问题讨论】:

您的 JAVA_HOME 无效。它不应该指向 JDK 的“bin”目录。 (运行javac -version 的“测试”不会验证JAVA_HOME,因为javac 命令不使用JAVA_HOME。您发现的文章具有误导性......或者您误读了它们。) 我很抱歉这么说,但这并没有多大帮助。我已经尝试了所有可能的方法来设置这些变量,无论是否使用 bin。 可能是空格字符问题(Windows 历来不能很好地处理空格)。尝试将 C:\Program Files\Java\jdk1.8.0_161 替换为 %ProgramFiles%\Java\jdk1.8.0_161 谢谢你的提示,但还是一样。我已经尝试过您建议的混合大小写,但也尝试使用所有大写字母。一切正常,但 Cordova 出于某种原因无法识别它。 你说%JAVA_HOME\bin%。你的意思是%JAVA_HOME%\bin 吗? 【参考方案1】:

我认为你混淆了 JAVA_HOME、PATH 和 CLASSPATH

JAVA_HOME 变量应设置为单个目录的名称。不是带有分隔符的多个目录。 JAVA_HOME 目录是 JDK 或 JRE 安装的***目录。不是“bin”目录。

PATH 和 CLASSPATH 变量由路径列表组成。对于 PATH,路径是目录的路径名。对于 CLASSPATH,路径是目录或 JAR / ZIP 文件(或特定类型的通配符)的路径名。

如果您使用简单名称的命令名称,则 PATH 是 shell 搜索命令的位置;例如javajavac。 `

CLASSPATH 是您可以告诉 Java 工具查看要加载、编译等的相关编译类的方法之一。

你的错误信息是这样的:

您的 JAVA_HOME 无效:

C:\Program Files\Java\jdk1.8.0_161;C:\Program Files\Java\jdk1.8.0_161\bin

这是错误的,原因有两个:

    JAVA_HOME 不应该是路径 C:\Program Files\Java\jdk1.8.0_161\bin 不是 Java 主目录。 Java 主页是 C:\Program Files\Java\jdk1.8.0_161 .... 可能。

您可能弄错的另一件事是环境变量的更改不一定会传播。例如,如果您启动 shell,然后通过 Windows GUI 更改环境变量,则更改可能不会传播到 shell。您可能需要退出 shell 并重新启动它以获取新值。

如果您不确定,可以运行(例如)echo %PATH% 以查看当前 shell 或脚本中 PATH 的当前值。

更新

根据http://cordova.apache.org/docs/en/7.x/guide/platforms/android/index.html,你需要:

安装 Android Studio 将ANDROID_HOME 环境变量设置为您的Android SDK 安装位置。

还建议您将 Android SDK 的 tools、tools/bin 和 platform-tools 目录添加到您的 PATH

【讨论】:

感谢您的努力,如果我的示例不清楚,我们深表歉意。我已经完全按照您之前所说的进行了尝试,但这也不起作用。但是为了它,我只是尝试了你告诉我的。将一切恢复原状(每个变量都恢复到原来的状态),然后将JAVA_HOME 设置为C:\Program Files\Java\jdk1.8.0_161。但是现在我什至不能再运行javac -version了。如果您在 Google 中输入“JAVA_HOME 无效”,那么您几乎会看到所有 Stack Overflow 问题以及我为解决问题而经历的其他文章,但到目前为止还没有任何解决方案。 “但是现在我什至不能运行 javac -version 了。” 那是因为 PATH 现在不正确了。您将 PATH 设置为什么?? "...您几乎可以看到所有 Stack Overflow 问题以及我为解决问题而阅读的其他文章" - 请参阅我的“And . ..不幸的是......”放在一边。 StackOveflow 中有许多不起作用的剪切和粘贴“解决方案”。正如我所说,了解 1)环境变量是如何工作的,以及 2)这 3 个特定的变量是做什么的,你就会明白你的问题是什么。 从你写的我明白了以下几点。 JAVA_HOME 应该是 Java 的家。但除此之外,我还必须将“路径”留给Path 中的bin 文件夹,这样当我执行命令时,系统就知道去哪里查找了。现在我有了:JAVA_HOME=C:\Program Files\Java\jdk1.8.0_161Path=C:\ProgramData\Oracle\Java\javapath;%JAVA_HOME%\bin;%JAVA_HOME%\bin;(请注意,我的 Path 中还有更多,但这两个是 Java 相关的,我已经手动设置了第二个)。但是:问题仍然存在。至少当我输入javac -version 时,我得到了我想要的。 你可能想运行dir c:\ /x并使用程序文件目录的短名称,应该是progra~1或类似【参考方案2】:

从 C:\Windows\System32(如果有)中删除 java.dll

我不确定,但它可能会正常工作。

【讨论】:

System32 文件夹中没有 java.dll(至少对我而言)。

以上是关于在 Windows 8.1 上,“javac -version”有效,但 Cordova 无法识别的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 8.1 上运行 Windows 10 通用应用

regopenkeyex 在 Windows 8.1 上返回 2

如何在 Windows Phone 8.1 / Windows 10 上创建自定义 VirtualizingPanel?

如何在 Windows 8.1 上运行 Elixir 脚本

在 Windows 8.1 频道上使用相同的推送通知频道

Windows Phone 8.1 应用程序未完全在 Windows 10 设备上运行