当前位置: 首页 > 知识库问答 >
问题:

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

庄兴发
2023-03-14

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

./gradlew assemble

我得到以下错误:

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

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

我还按照本主题中的建议设置了< code>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

用户路径:

reg query HKCU\Environment /v Path

ERROR: The system was unable to find the specified registry key or value.

系统路径:

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;

发布更新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

请参见以下路径的系统定义环境变量的屏幕截图:

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

更新2:

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

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)

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

更新3:

当我在CMD中执行java命令时,我得到以下内容:

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

更新 4:

MSYS2 中,我发出了以下命令:

export PATH=$PATH:"C:\x\Java\jdk1.8.0_191\bin"

这似乎解决了javac的问题:

checking for javac... javac
checking if javac works... yes
checking for C:\x\Java\jdk1.8.0_191/include/jni.h... yes

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

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

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

更新5:

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

更新6:

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

共有2个答案

钱黎明
2023-03-14

我建议使用开放JDK,因为在安装开放JDK期间可以自动配置路径。因此,您无需为 jdk 配置路径。

以下是链接:https://adoptopenjdk.net/

您可以选择版本8、11和16。

尹晟
2023-03-14

我将仔细研究构建过程的功能。您的问题表明您正在发出“gradlew”命令,所以首先要检查的是“gradleu--version”。如果您从中获得了Gradle和Java的预期版本,那么您的操作系统环境就一切正常。由于您的问题也提到了“Make”,我相信gradle正在调用Make。如果是这样的话,那么看看当Make启动时(Gradle)提供了什么环境。最好的猜测是“Make”所使用的环境与操作系统所使用的不同。e、 g.它具有不同的(或不存在的)$PATH或$JAVA_HOME。很容易检查…在“Makefile”中,让它输出诸如“env”或$PATH或$JAVA_HOME之类的内容-验证它们是否符合您的期望。

 类似资料:
  • 我正在使用Visual Studio2013进行CUDA(7.0)项目。该项目为64bit。我正在使用驱动程序API,需要从ptx或cubin文件加载模块。但我找不到文件。在VS I go properties->cuda C/C++->common->nvcc编译类型中,将其更改为-cubin或ptx。编译器完成ok但我找不到那个文件。我只能在output debug目录中看到kernel.cu

  • 也许你们中的某个人有解决办法。

  • 我正在使用Eclipse和Gradle。Twilio被列为依赖项。所有版本都是最新的。引用Gradle的代码将无法编译,并返回Twilio类不存在的错误消息。在线代码令人沮丧地过时了。我希望这里有人能帮忙。 我正在运行的代码非常基本:

  • 我在Eclipse中pom.xml中收到错误消息。 http://Maven.apache.org/Maven-v4_0_0.xsd“>4.0.0com.hmis chmis war 1.0-快照chmis Maven Webapp http://Maven.apache.org 这是我的pom.xml。当我运行该程序时,会出现如下错误。

  • 问题内容: 我正在尝试使用Ant将Web应用程序打包到war文件中。 构建时,出现以下错误: 以下是我的build.xml 如何编译没有主类的类文件? 如何设置课程路径? 作为参考,我正在使用Eclipse。 问题答案: 除了需要在JDK的/ lib目录中的tools.jar的javac任务以外,所有您的蚂蚁工具都可以正常工作,在这种情况下,JRE是不够的。因此,来自ant的提示是:“无法找到ja

  • 我无法从命令行编译Maven项目。我使用的是Maven版本: Apache Maven 3.5.4 null 这是我的pom.xml(没有依赖项): 新的堆栈跟踪是: