为什么 $PATH 中找不到 Java 编译器,也没有 Java 头文件 jni.h?

Bra*_*ggs 8 java gcc cmd environment-variables gradle

构建 JPostal时,我发出了命令:

./gradlew assemble
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

checking for gcj... no
checking for guavac... no
checking for jikes... no
checking for javac... no
configure: error: no acceptable Java compiler found in $PATH
make: *** No rule to make target 'install'.  Stop.
:buildJniLib FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':buildJniLib'.
> Process 'command 'sh'' finished with non-zero exit value 2
Run Code Online (Sandbox Code Playgroud)

问题是我已经将java编译器的正确路径添加到环境变量中。事实上,当我输入时,javac它会显示此 SO 答案中讨论的CMD所有选项。例如,在命令行中键入会显示正确的版本:javacjavac -versionjavac 1.8.0_191

我还按照此线程中的建议JAVA_HOME设置了环境变量。

为什么没有检测到 Java 编译器?

更新1

这三个命令的输出可以看到当前本地用户系统 Path的定义。

本地路径

set path

Path=C:\x\Java\jdk1.8.0_191\bin;C:\x\ProgramFiles\Firefox;C:\Windows\System32;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
Run Code Online (Sandbox Code Playgroud)

用户路径

reg query HKCU\Environment /v Path

ERROR: The system was unable to find the specified registry key or value.
Run Code Online (Sandbox Code Playgroud)

系统路径

reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v Path

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
    Path    REG_SZ    C:\x\Java\jdk1.8.0_191\bin;C:\x\ProgramFiles\Firefox;C:\Windows\System32;
Run Code Online (Sandbox Code Playgroud)

将信息发布到UPDATE 4后,根据环境变量控制面板对话框窗口的建议将系统路径修改为:

%SystemRoot%\system32
%SystemRoot%
%SystemRoot%\System32\Wbem
%SystemRoot%\System32\WindowsPowerShell\v1.0\
%SystemRoot%\System32\OpenSSH\
C:\x\Java\jdk1.8.0_191\bin
C:\x\ProgramFiles\Firefox
Run Code Online (Sandbox Code Playgroud)

系统定义的环境变量截图如下Path

系统环境变量Path的文件夹路径

注意:我没有删除 Firefox,因为它是内部原因所必需的,并且我认为它不会影响定义的其他变量。

更新2

which java当我在窗口中执行命令时,MSYS2我得到以下输出:

which: no java in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它没有检测到 Java。

更新3:

当我执行命令where java时,CMD我得到以下信息:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe
C:\x\Java\jdk1.8.0_191\bin\java.exe
Run Code Online (Sandbox Code Playgroud)

更新4

MSYS2我发出命令:

export PATH=$PATH:"C:\x\Java\jdk1.8.0_191\bin"
Run Code Online (Sandbox Code Playgroud)

这似乎解决了问题javac

checking for javac... javac
checking if javac works... yes
checking for C:\x\Java\jdk1.8.0_191/include/jni.h... yes
Run Code Online (Sandbox Code Playgroud)

但是,我仍然不明白为什么它没有正确读取环境变量。

此外,由于以下原因,构建仍然失败:

checking for gcj... no
checking for guavac... no
checking for jikes... no
checking for javac... javac
checking if javac works... yes
checking for C:\x\Java\jdk1.8.0_191/include/jni.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for size_t... yes
checking for uint16_t... yes
checking for GNU libc compatible malloc... yes
checking for strdup... yes
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for LIBPOSTAL... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/main/c/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
config.status: executing libtool commands
Making install in src/main/c
make[1]: Entering directory '/c/x/ProgramFiles/JPostal/src/main/c'
/bin/sh ../../../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../..    -I/mingw64/include  -g -O2 -IC:\x\Java\jdk1.8.0_191/include -MT libjpostal_parser_la-jpostal_AddressParser.lo -MD -MP -MF .deps/libjpostal_parser_la-jpostal_AddressParser.Tpo -c -o libjpostal_parser_la-jpostal_AddressParser.lo `test -f 'jpostal_AddressParser.c' || echo './'`jpostal_AddressParser.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I../../.. -I/mingw64/include -g -O2 -IC:xJavajdk1.8.0_191/include -MT libjpostal_parser_la-jpostal_AddressParser.lo -MD -MP -MF .deps/libjpostal_parser_la-jpostal_AddressParser.Tpo -c jpostal_AddressParser.c  -DDLL_EXPORT -DPIC -o .libs/libjpostal_parser_la-jpostal_AddressParser.o
jpostal_AddressParser.c:1:10: fatal error: jni.h: No such file or directory
    1 | #include <jni.h>
      |          ^~~~~~~
compilation terminated.
make[1]: *** [Makefile:473: libjpostal_parser_la-jpostal_AddressParser.lo] Error 1
make[1]: Leaving directory '/c/x/ProgramFiles/JPostal/src/main/c'
make: *** [Makefile:404: install-recursive] Error 1
Run Code Online (Sandbox Code Playgroud)

更新5

请参见下面的屏幕截图,显示 Java 的安装目录:

目录C:\x\Java\jdk1.8.0_191的内容

更新6

下面的屏幕截图显示了jni.hJava 安装文件夹中存在的文件:

目录 C:\x\Java\jdk1.8.0_191\include 的内容

Jef*_*ett 0

我会仔细研究您的构建过程如何运作。您的问题表明您正在发出“gradlew”命令,因此首先要检查的是“gradlew --version”。如果您从中获得了预期的 Gradle 和 Java 版本,那么您的操作系统环境一切正常。由于您的问题也提到了“Make”,所以我相信 gradle 正在调用 Make。如果是这种情况,请查看 Make 启动时(由 Gradle)提供的环境。最好的猜测是“Make”使用的环境与操作系统所使用的环境有所不同。例如,它有一个不同的(或不存在的)$PATH 或$JAVA_HOME。易于检查...在“Makefile”中,让它输出诸如“env”或 $PATH 或 $JAVA_HOME 之类的内容 - 验证它们是否是您所期望的。