Gradle构建后运行单独class文件提示找不到或无法加载主类
问题根因
直接执行class文件报错是两个原因共同导致的:
- Java命令使用错误:
java命令执行编译后的class文件时,不能直接传入.class文件的完整路径,需要先通过-cp/-classpath参数指定类所在的根目录,再传入不带.class后缀的类名。你写的java build\classes\java\main\JaJson.class会被Java识别为查找名为build.classes.java.main.JaJson.class的全限定类,自然找不到对应类。 - Gradle配置存在冗余:你自定义了没用的
singleSourceSet和compileSingle任务,虽然当前没有影响编译结果,但后续修改配置时容易出现源集冲突问题。
解决方案
立即修复执行命令
将你原有命令中执行class的部分替换为下面的写法即可正常运行:
java -cp build\classes\java\main JaJson
修改后的完整执行命令为:
gradle build && java -jar build\libs\jajson-1.2.1.jar && java -cp build\classes\java\main JaJson
可选配置优化(推荐)
删除build.gradle中的冗余配置,避免后续出现潜在问题:
- 移除未使用的
singleSourceSet配置 - 移除未使用的
compileSingle自定义任务 - 规范配置main源集的源码路径
优化后的build.gradle核心配置片段如下:
apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'application' mainClassName = "JaJson" repositories { mavenCentral() } java { toolchain { languageVersion = JavaLanguageVersion.of(11) } } // 规范配置main源集的源码路径,替换原有冗余的single源集配置 sourceSets { main { java { srcDir 'src' } } } jar { manifest { attributes( 'Class-Path': configurations.compile.collect { it.getName() }.join(' '), 'Main-Class': 'JaJson' ) } } compileJava { options.release = 7 } version = '1.2.1' dependencies { implementation "joda-time:joda-time:2.2" testImplementation "junit:junit:4.12" }
内容的提问来源于stack exchange,提问作者Bussiere
相关产品推荐
相关产品推荐

