此错误是由于 Antlr4 未能找到合适的 Java 版本引起的。在 Windows 机器上,Antlr4 首先检查注册表,然后再检查您的环境变量以确定 Java 的合适位置。
在我遇到同样的问题之前不久,我一直在整合我计算机上的许多 Java 运行时环境实例。我有很多,我将它们缩减为每个 64b JRE 和 32b JRE 的 1 个实例。我只删除了他们的文件夹就删除了其余部分。随后我检查了我的用户和系统环境变量(特别是JAVA_HOME
)是否仍然指向一个有效的 Java 目录。
但我没有意识到也有一些注册表项需要更新。可能重新安装 Java 会修复注册表项,但我恢复为手动修复它们。
因此,Antlr4 代码中的适当位置位于https://github.com/tunnelvisionlabs/antlr4cs/blob/master/runtime/CSharp/Antlr4BuildTasks/Antlr4ClassGenerationTaskInternal.cs#L144。
private string JavaHome
{
get
{
#if !NETSTANDARD
string javaHome;
if (TryGetJavaHome(RegistryView.Default, JavaVendor, JavaInstallation, out javaHome))
return javaHome;
if (TryGetJavaHome(RegistryView.Registry64, JavaVendor, JavaInstallation, out javaHome))
return javaHome;
if (TryGetJavaHome(RegistryView.Registry32, JavaVendor, JavaInstallation, out javaHome))
return javaHome;
#endif
if (Directory.Exists(Environment.GetEnvironmentVariable("JAVA_HOME")))
return Environment.GetEnvironmentVariable("JAVA_HOME");
throw new NotSupportedException("Could not locate a Java installation.");
}
}
#if !NETSTANDARD
private static bool TryGetJavaHome(RegistryView registryView, string vendor, string installation, out string javaHome)
{
javaHome = null;
string javaKeyName = "SOFTWARE\\" + vendor + "\\" + installation;
using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
{
using (RegistryKey javaKey = baseKey.OpenSubKey(javaKeyName))
{
if (javaKey == null)
return false;
object currentVersion = javaKey.GetValue("CurrentVersion");
if (currentVersion == null)
return false;
using (var homeKey = javaKey.OpenSubKey(currentVersion.ToString()))
{
if (homeKey == null || homeKey.GetValue("JavaHome") == null)
return false;
javaHome = homeKey.GetValue("JavaHome").ToString();
return !string.IsNullOrEmpty(javaHome);
}
}
}
}
#endif
您的.\packages\Antlr4.CodeGenerator.4.6.3\build\Antlr4.CodeGenerator.targets
文件(调整为正确的版本号)具有设置JavaVendor
和JavaInstallation
变量的行:
<Antlr4JavaVendor Condition="'$(Antlr4JavaVendor)'==''">JavaSoft</Antlr4JavaVendor>
<Antlr4JavaInstallation Condition="'$(Antlr4JavaInstallation)'==''">Java Runtime Environment</Antlr4JavaInstallation>
因此,至少在我的情况下,适当的注册表设置位于HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
要修复不正确的注册表:
请记住,Visual Studio 是一个 32b 进程,默认情况下,它将通过查找 JRE 的 32b 版本来运行 Antlr4。如果出于某种原因,您正在使用 64b 进程在 Visual Studio 之外构建解决方案,则使用 64b 版本的注册表。