OpenCV从源代码编译失败,报错Java 11:警告:目标版本11与默认源代码版本18冲突。

3
我正在开发一个运行Java 11的Java应用程序。我选择Java 11是因为它是最后一个具有LTS的Java版本。 在这个Java应用程序中,我使用了OpenCV,并使用了来自contrib模块的库。我使用Homebrew安装带有Java绑定和contrib模块的OpenCV。
我尝试的第一件事是在没有指定Java目标版本的情况下从源代码安装OpenCV。当我这样做时,OpenCV正确安装,但是当我尝试在代码中使用它时,我遇到了以下错误:
class file has wrong version 61.0, should be 55.0
我认为这意味着由于OpenCV是通过Java 17编译的,所以我不能在我的Java 11代码中使用它。值得一提的是,因为我在我的Java项目中使用Maven,所以我首先通过类似于mvn install:install-file -Dfile=/usr/local/Cellar/opencv/4.5.5_1/share/java/opencv4/opencv-455.jar的方式将OpenCV JAR导出到本地Maven模块中。我在这个导出过程中使用的是OpenJDK 11作为我的JRE。
我也将OpenJDK 11作为我的Mac上的默认JDK(java -version和javac -version都返回OpenJDK 11)。所以看到这个错误,我有点惊讶。 因此,为了解决这个问题,我一直在尝试使用标志-DOPENCV_JAVA_TARGET_VERSION=11安装OpenCV。但是,当我这样做时,我遇到了以下错误:
[ 11%] Generating opencv-455.jar
cd /tmp/opencv-20220410-81173-p3o3uo/opencv-4.5.5/build/modules/java/jar/opencv && /usr/local/bin/ant -noinput -k jar
Picked up _JAVA_OPTIONS: -Duser.home=/Users/dpapp/Library/Caches/Homebrew/java_cache
Buildfile: /private/tmp/opencv-20220410-81173-p3o3uo/opencv-4.5.5/build/modules/java/jar/opencv/build.xml
   [tstamp] Honouring environment variable SOURCE_DATE_EPOCH which has been set to 1640404407

jar:
    [javac] Compiling 280 source files to /private/tmp/opencv-20220410-81173-p3o3uo/opencv-4.5.5/build/modules/java/jar/opencv/build/classes
    [javac] warning: target release 11 conflicts with default source release 18
Target 'jar' failed with message 'Compile failed; see the compiler error output for details.'.

BUILD FAILED
/private/tmp/opencv-20220410-81173-p3o3uo/opencv-4.5.5/build/modules/java/jar/opencv/build.xml:14: Compile failed; see the compiler error output for details

这个错误提示好像暗示OpenCV需要至少JDK 18,但我觉得这不太对。每个OpenCV版本是否都有最低要求的JDK版本?是不是应该使用OpenCV 3呢?非常感谢您的帮助,谢谢!

1
你为什么说“我选择Java 11是因为它是最后一个带有LTS的Java版本”?Java 17也有LTS - skomisa
哦,哇!我甚至没有意识到那就是情况。不过,问题仍然存在。 - David Papp
1
从字面上看,您的错误“目标版本11与默认源版本18冲突”似乎表明您已经成功指定了目标版本为11,但是您没有明确指定源版本也是11,因此您被卡在了默认版本18上。尝试添加参数-DOPENCV_JAVA_SOURCE_VERSION=11。请参见OpenCV问题13435 - skomisa
哇!问题解决了!我猜关键是要设置-DOPENCV_JAVA_SOURCE_VERSION=11标志。非常感谢你! - David Papp
很好。那么,你能否更新你自己的答案并说明你是如何解决问题的,然后接受它呢?接受答案对SO社区来说更有帮助。 - skomisa
1个回答

1

我部分地弄清楚了这里正在发生什么。

在运行brew install opencv之前,我运行了brew install ant brew install ant 安装了最新的OpenJDK(在撰写本文时为OpenJDK 18),并忽略了我电脑上设置的Java主目录路径。 这导致brew install opencv尝试使用Java 18安装OpenCV,而目标版本为11,从而导致错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接