Windows环境下WPILIB项目Gradle正常但gradlew报错求助
Windows下WPILib项目gradlew执行异常问题
在Windows笔记本上安装WPILIB并创建FRC项目后,直接使用gradle命令构建完全正常,但执行gradlew时失败,报错信息如下:
>gradlew Exception in thread "main" java.lang.ClassNotFoundException: org.gradle.launcher.GradleMain at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) at org.gradle.wrapper.GradleWrapperMain.main(SourceFile:70)
此外,gradlew无法响应指定命令,无论输入什么参数都仅执行构建操作。已尝试重新生成wrapper(执行gradle wrapper)、多次重装WPILIB,且该项目在GitHub Codespaces、Arch Linux以及Windows虚拟机上均可正常运行,但本地Windows主机问题始终无法解决。
项目配置文件
build.gradle
plugins { id "java" id "edu.wpi.first.GradleRIO" version "2024.1.1" } java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } def ROBOT_MAIN_CLASS = "frc.robot.Main" // Define my targets (RoboRIO) and artifacts (deployable files) // This is added by GradleRIO's backing project DeployUtils. deploy { targets { roborio(getTargetTypeClass('RoboRIO')) { // Team number is loaded either from the .wpilib/wpilib_preferences.json // or from command line. If not found an exception will be thrown. // You can use getTeamOrDefault(team) instead of getTeamNumber if you // want to store a team number in this file. team = project.frc.getTeamNumber() debug = project.frc.getDebugOrDefault(false) artifacts { // First part is artifact name, 2nd is artifact type // getTargetTypeClass is a shortcut to get the class type using a string frcJava(getArtifactTypeClass('FRCJavaArtifact')) { } // Static files artifact frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { files = project.fileTree('src/main/deploy') directory = '/home/lvuser/deploy' } } } } } def deployArtifact = deploy.targets.roborio.artifacts.frcJava // Set to true to use debug for JNI. wpi.java.debugJni = false // Set this to true to enable desktop support. def includeDesktopSupport = false // Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. // Also defines JUnit 5. dependencies { implementation wpi.java.deps.wpilib() implementation wpi.java.vendor.java() roborioDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.roborio) roborioDebug wpi.java.vendor.jniDebug(wpi.platforms.roborio) roborioRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.roborio) roborioRelease wpi.java.vendor.jniRelease(wpi.platforms.roborio) nativeDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.desktop) nativeDebug wpi.java.vendor.jniDebug(wpi.platforms.desktop) simulationDebug wpi.sim.enableDebug() nativeRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.desktop) nativeRelease wpi.java.vendor.jniRelease(wpi.platforms.desktop) simulationRelease wpi.sim.enableRelease() testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } test { useJUnitPlatform() systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true' } // Simulation configuration (e.g. environment variables). wpi.sim.addGui().defaultEnabled = true wpi.sim.addDriverstation() // Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') // in order to make them all available at runtime. Also adding the manifest so WPILib // knows where to look for our Robot Class. jar { from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } from sourceSets.main.allSource manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS) duplicatesStrategy = DuplicatesStrategy.INCLUDE } // Configure jar and deploy tasks deployArtifact.jarTask = jar wpi.java.configureExecutableTasks(jar) wpi.java.configureTestTasks(test) // Configure string concat to always inline compile tasks.withType(JavaCompile) { options.compilerArgs.add '-XDstringConcat=inline' }
settings.gradle
import org.gradle.internal.os.OperatingSystem pluginManagement { repositories { mavenLocal() gradlePluginPortal() String frcYear = '2024' File frcHome if (OperatingSystem.current().isWindows()) { String publicFolder = System.getenv('PUBLIC') if (publicFolder == null) { publicFolder = "C:\\Users\\Public" } def homeRoot = new File(publicFolder, "wpilib") frcHome = new File(homeRoot, frcYear) } else { def userFolder = System.getProperty("user.home") def homeRoot = new File(userFolder, "wpilib") frcHome = new File(homeRoot, frcYear) } def frcHomeMaven = new File(frcHome, 'maven') maven { name 'frcHome' url frcHomeMaven } } } Properties props = System.getProperties(); props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true");
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME distributionPath=permwrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=permwrapper/dists
解决方法
1. 重置Gradle Wrapper文件
- 删除项目根目录下的
.gradle文件夹、gradlew、gradlew.bat以及gradle/wrapper文件夹 - 在项目根目录执行
gradle wrapper --gradle-version 8.5,重新生成完整的Wrapper文件
2. 调整Gradle缓存路径权限
- 检查
C:\Users\<你的用户名>\.gradle目录是否有读写权限,若权限不足,右键目录→属性→安全→添加当前用户的完全控制权限 - 或者修改
gradle-wrapper.properties,将缓存路径改为项目本地目录,避免系统权限问题:distributionBase=PROJECT_DIR distributionPath=gradle/wrapper/dists zipStoreBase=PROJECT_DIR zipStorePath=gradle/wrapper/dists
3. 确认Java环境正确性
- 执行
java -version,确保使用的是Java 17(WPILIB 2024强制要求) - 检查
JAVA_HOME环境变量是否指向JDK 17的安装路径,避免使用JRE运行
4. 排除安全软件干扰
- 临时关闭杀毒软件、防火墙或Windows Defender的实时保护,重新执行
gradlew测试
5. 手动下载Gradle分发包
- 手动下载gradle-8.5-bin压缩包,放到
C:\Users\<你的用户名>\.gradle\permwrapper\dists目录下 - 确保压缩包完整未损坏,Gradle Wrapper会自动识别并解压使用
内容的提问来源于stack exchange,提问作者Jerry Zheng
相关产品推荐
相关产品推荐

