使用Gradle构建项目时遇到OpenNLP类文件版本不兼容错误
问题描述
手动执行以下命令时,项目运行完全正常:
javac -cp tika/tika-2.8.0/tika-app-2.8.0.jar:opennlp/apache-opennlp-2.2.0/lib/* App.java java -cp .:tika/tika-2.8.0/tika-app-2.8.0.jar:opennlp/apache-opennlp-2.2.0/lib/* App
尝试用Gradle自动化构建,创建了如下目录结构:
$ tree -L 2 my-app/ my-app/ ├── build │ ├── classes │ ├── generated │ └── tmp ├── build.gradle ├── opennlp │ ├── apache-opennlp-2.2.0 │ └── apache-opennlp-2.2.0-bin.zip ├── src │ └── main └── tika ├── tika-2.8.0 └── tika-2.8.0-src.zip $ tree src src └── main └── java └── App.java
build.gradle配置如下:
plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation files('tika/tika-2.8.0/tika-app-2.8.0.jar') implementation files('opennlp/apache-opennlp-2.2.0/lib/opennlp-tools-2.2.0.jar') } task runApp(type: JavaExec) { main = 'App' classpath = sourceSets.main.runtimeClasspath }
执行gradle build后出现编译错误:
$ gradle build > Task :compileJava /home/me/tmp/my-app/src/main/java/App.java:7: error: cannot access opennlp.tools.sentdetect.SentenceDetectorME import opennlp.tools.sentdetect.SentenceDetectorME; ^ bad class file: /home/me/tmp/my-app/opennlp/apache-opennlp-2.2.0/lib/opennlp-tools-2.2.0.jar(opennlp/tools/sentdetect/SentenceDetectorME.class) class file has wrong version 55.0, should be 52.0 Please remove or make sure it appears in the correct subdirectory of the classpath. > Task :compileJava FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileJava'. > Compilation failed; see the compiler error output for details. * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See https://docs.gradle.org/7.4.2/userguide/command_line_interface.html#sec:command_line_warnings BUILD FAILED in 4s 1 actionable task: 1 executed
环境版本信息:
$ java --version openjdk 17.0.7 2023-04-18 OpenJDK Runtime Environment (build 17.0.7+7-Ubuntu-0ubuntu118.04) OpenJDK Server VM (build 17.0.7+7-Ubuntu-0ubuntu118.04, mixed mode, sharing) $ javac --version javac 17.0.7 $ gradle --version ------------------------------------------------------------ Gradle 7.4.2 ------------------------------------------------------------ Build time: 2022-03-31 15:25:29 UTC Revision: 540473b8118064efcc264694cbcaa4b677f61041 Kotlin: 1.5.31 Groovy: 3.0.9 Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021 JVM: 1.8.0_362 (Private Build 25.362-b09) OS: Linux 4.15.0-211-generic i386
解决方案
错误原因
报错里的版本号对应:55.0是Java 11的class文件版本,52.0是Java 8的版本。手动编译用的是Java 17,兼容Java 11编译的jar;但Gradle当前使用的是Java 8运行,无法识别Java 11编译的opennlp-tools-2.2.0.jar,导致版本不兼容错误。
解决步骤
让Gradle使用Java 17运行
- 方法一:在项目根目录创建
gradle.properties文件,添加以下内容(替换为你的Java 17实际安装路径):org.gradle.java.home=/usr/lib/jvm/java-17-openjdk-i386 - 方法二:在运行Gradle命令前设置环境变量:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-i386 gradle build
- 方法一:在项目根目录创建
优化依赖配置(可选,推荐)
放弃本地jar依赖,直接用MavenCentral的远程依赖,Gradle会自动匹配兼容版本,避免本地文件的版本问题。修改build.gradle为:plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.apache.tika:tika-app:2.8.0' implementation 'org.apache.opennlp:opennlp-tools:2.2.0' } task runApp(type: JavaExec) { main = 'App' classpath = sourceSets.main.runtimeClasspath }验证
执行gradle build确认编译通过,再执行gradle runApp验证项目正常运行。
内容的提问来源于stack exchange,提问作者xralf
相关产品推荐
相关产品推荐

