{"record":{"id":"e034fd9275cd843d","repo":"microsoft/aspire","slug":"argumentoutofrangeexception-specified-argument-was-out-of-e034fd","errorCode":null,"errorMessage":"ArgumentOutOfRangeException: Specified argument was out of range of valid values. (Parameter 'tool')","messagePattern":"ArgumentOutOfRangeException: Specified argument was out of range of valid values\\. \\(Parameter 'tool'\\)","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Java/JavaBuildToolResolver.cs","lineNumber":198,"sourceCode":"        {\n            return new DirectoryInfo(path);\n        }\n        catch (Exception ex) when (ex is ArgumentException or PathTooLongException or NotSupportedException)\n        {\n            return null;\n        }\n    }\n\n    /// <summary>\n    /// Returns the conventional wrapper name for a build tool on the requested execution platform.\n    /// </summary>\n    internal static string GetDefaultWrapperName(JavaBuildTool tool, bool isWindows) => (tool, isWindows) switch\n    {\n        (JavaBuildTool.Maven, true) => \"mvnw.cmd\",\n        (JavaBuildTool.Maven, false) => \"mvnw\",\n        (JavaBuildTool.Gradle, true) => \"gradlew.bat\",\n        (JavaBuildTool.Gradle, false) => \"gradlew\",\n        _ => throw new ArgumentOutOfRangeException(nameof(tool), tool, null)\n    };\n}\n","sourceCodeStart":180,"sourceCodeEnd":201,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Java/JavaBuildToolResolver.cs#L180-L201","documentation":"JavaBuildToolResolver.GetDefaultWrapperName maps (JavaBuildTool, isWindows) to the wrapper script name (mvnw/mvnw.cmd, gradlew/gradlew.bat) and throws ArgumentOutOfRangeException for any tool value outside Maven or Gradle. Like error 980, it is a defensive switch exhaustiveness guard against an unknown JavaBuildTool.","triggerScenarios":"Passing default(JavaBuildTool), an int cast to JavaBuildTool outside the defined members, or a newly added enum member into the wrapper-name resolution path used when preparing wrapper-based launch commands.","commonSituations":"Config deserialization yields an invalid tool number; resource model built without specifying the tool; version skew between the enum definition and resolver code after a package upgrade.","solutions":["Explicitly specify Maven or Gradle for the Java resource (e.g. via the build tool parameter of the AddJavaApp/With* APIs).","Validate incoming tool values with Enum.IsDefined before use.","Align package versions so JavaBuildTool and its resolvers match."],"exampleFix":"// before\nvar wrapper = JavaBuildToolResolver.GetDefaultWrapperName(default, isWindows: false);\n// after\nvar wrapper = JavaBuildToolResolver.GetDefaultWrapperName(JavaBuildTool.Gradle, isWindows: false);","handlingStrategy":"type-guard","validationCode":"if (tool is not (JavaBuildTool.Maven or JavaBuildTool.Gradle)) throw new ArgumentException($\"Unsupported JavaBuildTool: {tool}\");\nvar wrapper = JavaBuildToolResolver.GetDefaultWrapperName(tool, OperatingSystem.IsWindows());","typeGuard":"static bool IsKnownJavaBuildTool(JavaBuildTool tool) => tool is JavaBuildTool.Maven or JavaBuildTool.Gradle;","tryCatchPattern":"try { var wrapper = JavaBuildToolResolver.GetDefaultWrapperName(tool, isWindows); } catch (ArgumentOutOfRangeException ex) { log.LogError(ex, \"Cannot resolve wrapper for tool {Tool}\", tool); }","preventionTips":["Pass Maven or Gradle explicitly when configuring Java resources.","Sanitize any enum value read from configuration or JSON before casting.","After upgrading Aspire.Hosting.Java, recompile so enum and resolvers match."],"tags":["java","enum","argument-out-of-range","wrapper"],"backgroundTag":"invalid-enum-value","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}