Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate Java project scaffolding with Maven/Gradle, JUnit 5, Mockito, Checkstyle/SpotBugs, and packaging (JAR/WAR/native-image).
.claude/skills/williamzujkowski-java-tooling-specialist/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-21 | ✗→✓ | ▲ Improved | 77% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 82% | 0% |
Trigger conditions:
Not for:
tooling-kotlin-generator instead)Time normalization:
NOW_ET using NIST/time.gov semantics (America/New_York, ISO-8601)NOW_ET for all citation access datesInput validation:
project_type must be one of: library, application, spring-boot, microservicebuild_tool must be one of: maven, gradlejava_version must be one of: 11, 17, 21 (LTS versions)project_name must be valid Java package name (lowercase, dots/hyphens allowed)Source freshness:
Fast path for common cases:
project-name/ src/ main/ java/com/example/project/ resources/ test/ java/com/example/project/ resources/ pom.xml (Maven) or build.gradle (Gradle) README.md .gitignore
Decision: If only basic scaffolding needed → STOP at T1; otherwise proceed to T2.
Extended configuration with testing and quality tools:
JUnit 5 + Mockito accessed 2025-10-26
Maven dependencies: xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.10.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.8.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>5.8.0</version> <scope>test</scope> </dependency>
Gradle (build.gradle): gradle dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' testImplementation 'org.mockito:mockito-core:5.8.0' testImplementation 'org.mockito:mockito-junit-jupiter:5.8.0' }
test { useJUnitPlatform() }
Checkstyle accessed 2025-10-26
SpotBugs accessed 2025-10-26
PMD (optional)
project_type == spring-boot)xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent>
Deep configuration for production deployment:
dockerfile FROM maven:3.9-eclipse-temurin-21 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src src RUN mvn package -DskipTests
FROM eclipse-temurin:21-jre-alpine COPY --from=build /app/target/.jar app.jar ENTRYPOINT "java", "-jar", "/app.jar"]
java @Testcontainers class IntegrationTest { @Container static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine"); }
Build Tool Selection:
Project Type Structure:
Abort Conditions:
project_name (contains spaces, uppercase, invalid chars) → errorjava_version (<11) → error "Minimum Java 11 required"Tool Version Selection:
Schema (JSON):
json{ "project_name": "string", "project_type": "library | application | spring-boot | microservice", "java_version": "string", "build_tool": "maven | gradle", "structure": { "directories": ["string"], "files": { "path/to/file": "file content (string)" } }, "commands": { "build": "string", "test": "string", "package": "string", "run": "string (optional)" }, "next_steps": ["string"], "timestamp": "ISO-8601 string (NOW_ET)" }
Required Fields:
project_name, project_type, java_version, build_tool, structure, commands, next_steps, timestampFile Contents:
Quick Start: Java Library (30 lines)
java// examples/LibraryExample.java package com.example.utils; import java.time.Instant; import java.util.*; public final class StringMetrics { public record Metrics(int length, int wordCount, Instant analyzed) {} private final List<String> history = new ArrayList<>(); public Metrics analyze(String text) { if (text == null || text.isBlank()) { throw new IllegalArgumentException("Text cannot be null or blank"); } history.add(text); int wordCount = text.split("\\s+").length; return new Metrics(text.length(), wordCount, Instant.now()); } public List<String> getHistory() { return Collections.unmodifiableList(history); } }
Additional Examples:
examples/CliExample.java (30 lines) - picocli, file I/O, exit codesexamples/ApiExample.java (36 lines) - REST endpoints, records, concurrent storageTemplate Resources (see resources/)
pom-library.xml / pom-cli.xml / pom-springboot.xmlbuild-library.gradle / build-cli.gradle / build-springboot.gradleExampleTest.java - JUnit 5 with modern assertionsToken Budgets:
Safety:
Auditability:
Determinism:
Performance:
Official Documentation (accessed 2025-10-26):
Build Tools:
Best Practices:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→pass | 14,786 | 10,104 | -32% | 1 | 1 | 0% | 3,095 | 5,477 | +77% | 0 | 0 | — |
case-01 | fail→pass | 15,216 | 17,970 | +18% | 1 | 1 | 0% | 3,153 | 6,356 | +102% | 0 | 0 | — |
case-02 | fail→pass | 21,162 | 29,094 | +37% | 1 | 1 | 0% | 4,828 | 6,713 | +39% | 0 | 0 | — |
case-03 | fail→pass | 28,230 | 38,922 | +38% | 1 | 1 | 0% | 6,212 | 8,370 | +35% | 0 | 0 | — |
case-04 | fail→pass | 16,274 | 11,203 | -31% | 1 | 1 | 0% | 2,975 | 5,405 | +82% | 0 | 0 | — |
case-05 | fail→pass | 16,447 | 3,108 | -81% | 1 | 1 | 0% | 2,816 | 3,686 | +31% | 0 | 0 | — |
case-06 | pass→pass | 5,783 | 6,165 | +7% | 1 | 1 | 0% | 850 | 4,280 | +404% | 0 | 0 | — |
case-07 | fail→pass | 7,509 | 6,275 | -16% | 1 | 1 | 0% | 1,491 | 4,340 | +191% | 0 | 0 | — |
case-08 | fail→fail | 9,917 | 20,906 | +111% | 1 | 1 | 0% | 1,915 | 7,207 | +276% | 0 | 0 | — |
case-09 | pass→pass | 8,565 | 6,626 | -23% | 1 | 1 | 0% | 1,602 | 4,509 | +181% | 0 | 0 | — |
case-10 | pass→pass | 7,322 | 4,014 | -45% | 1 | 1 | 0% | 1,324 | 3,836 | +190% | 0 | 0 | — |
case-11 | pass→pass | 2,153 | 2,721 | +26% | 1 | 1 | 0% | 362 | 3,605 | +896% | 0 | 0 | — |
case-12 | pass→pass | 11,261 | 5,970 | -47% | 1 | 1 | 0% | 1,918 | 4,258 | +122% | 0 | 0 | — |
case-13 | pass→pass | 12,172 | 9,950 | -18% | 1 | 1 | 0% | 2,140 | 5,014 | +134% | 0 | 0 | — |
case-14 | pass→pass | 8,696 | 7,639 | -12% | 1 | 1 | 0% | 1,613 | 4,642 | +188% | 0 | 0 | — |
case-15 | pass→pass | 9,936 | 8,519 | -14% | 1 | 1 | 0% | 1,619 | 4,891 | +202% | 0 | 0 | — |
case-16 | pass→pass | 9,650 | 11,521 | +19% | 1 | 1 | 0% | 1,658 | 5,365 | +224% | 0 | 0 | — |
case-17 | pass→pass | 11,365 | 12,460 | +10% | 1 | 1 | 0% | 2,177 | 5,830 | +168% | 0 | 0 | — |
case-18 | pass→pass | 6,795 | 5,456 | -20% | 1 | 1 | 0% | 1,120 | 4,176 | +273% | 0 | 0 | — |
case-19 | pass→pass | 11,212 | 9,272 | -17% | 1 | 1 | 0% | 1,997 | 4,640 | +132% | 0 | 0 | — |
case-20 | pass→pass | 9,199 | 6,717 | -27% | 1 | 1 | 0% | 1,903 | 4,545 | +139% | 0 | 0 | — |
case-22 | pass→pass | 10,766 | 9,533 | -11% | 1 | 1 | 0% | 1,848 | 4,799 | +160% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +32 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.