quarkusio/skills

migrate-spring-to-quarkus

Migrates Spring Boot applications to Quarkus using a modular, gate-driven approach.

소스 보기

사용 방법

  1. 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
  2. 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
  3. 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/quarkusio/skills --skill migrate-spring-to-quarkus

시작 전 확인

  • 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
  • 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 Skill 문서

원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.

Spring Boot to Quarkus Migration

Modular, gate-driven migration of Spring Boot applications to Quarkus.

Critical Rules

  • Never delete code you cannot migrate. If you cannot fully migrate a piece of code, leave the original in place with a // TODO: Migration required — <reason> comment explaining what needs to change and why. This applies to:
  • Methods, classes, or annotations you don't know how to convert
  • Spring-specific patterns without a clear Quarkus equivalent
  • Configuration or wiring code whose purpose is unclear

If you must remove code (e.g., a Spring-only base class), document what was removed and why in a // REMOVED: comment at the same location.

  • Don't break the build. Run the compile command in <target> after each phase (cd <target> && ./mvnw clean compile -DskipTests for Maven, cd <target> && ./gradlew clean compileJava -x test for Gradle). Never move to the next phase with a broken build.
  • Source is read-only. Never modify files in <source>. All changes go into <target>. The only exception is <source>/migration-metadata/, where extraction metadata may be written.
  • Document every decision. When choosing between migration approaches, explain the trade-off to the user.
  • No silent changes. Every file modification must be intentional and traceable. If a check fails after a phase, diagnose and fix — don't skip the check or delete the failing code.

Reference Files

Load the relevant reference file when working on a module:

ReferenceUse during
references/dependency-map.mdBuild module: dependency and plugin mapping
references/annotation-map.mdCode module: annotation, DI, REST, Data, Security migration
references/config-map.mdBuild module: configuration property migration

Step 1: Execute Modules

Instructions

  • Execute the instructions of the modules according to the following Decision Gate Table
  • Always log which Module and Gate check is evaluated and the status using the format:

Gate result: <STATUS> and <CONDITION_EVALUATED>

Decision Gate Table

  • For each module, evaluate whether it applies by inspecting <source>. A module executes only when its gate status is: PASS.
  • Inspect <source> to determine the gate result -- do not rely on blind grep commands; use your understanding of the codebase.
ModuleGate CheckGate Result
prerequisiteJDK version, build tool (Maven ≥ 3.6 recommended 3.9+ / Gradle ≥ 7 recommended 8.x), container runtimeALWAYS — ABORT entire migration if any hard check fails; no subsequent module runs
planningPrerequisite check passedALWAYS — generates <target>/migration-spec.yaml
buildSpring Boot parent/starters/spring-boot-maven-plugin in pom.xml, or Spring Boot/io.spring.dependency-management plugins in build.gradle(.kts)PASS if Spring Boot build markers found; SKIP otherwise
codeSpring annotations in Java sources (@Component, @Service, @Controller, @Repository, @Entity, @Autowired, etc.)PASS if Spring annotations found; SKIP otherwise
messaging@KafkaListener, @RabbitListener, @JmsListener, @SendTo, @EnableKafka, @EnableRabbit, KafkaTemplate, RabbitTemplate, or JmsTemplate in Java sourcesPASS if any found; SKIP otherwise
frontendThymeleaf/JSP templates in templates/ or webapp/, static resources in static/, JSF XHTML files in webapp/ or META-INF/resources/, FreeMarker templates (.ftl, .ftlh, .ftlx), freemarker.* imports, or FreeMarkerConfigurer beanPASS if view layer found; SKIP otherwise
testingSpring test annotations in test sources (@SpringBootTest, @WebMvcTest, @MockBean)PASS if Spring tests found; SKIP otherwise
cleanupLeftover Spring artifacts after all other modulesALWAYS -- runs after all other modules

Execution Protocol

STEP 0 — PREREQUISITE GATE (mandatory, runs before everything else)
  1. LOAD modules/prerequisite/prerequisite.md and execute all checks
  2. IF prerequisite gate == FAIL
       → log "Migration aborted — prerequisite gate failed: <failing check(s)>"
       → STOP immediately. Do not evaluate or execute any further module.
  3. IF prerequisite gate == PASS (warnings are allowed)
       → log "Prerequisite gate: PASS — proceeding with migration"
       → continue to the module loop below

FOR module IN [planning, build, code, messaging, frontend, testing, cleanup]:

  1. EVALUATE — inspect <source> for the gate condition
  2. DECIDE
     IF gate == ALWAYS → proceed to step 3
     IF gate == PASS   → proceed to step 3
     IF gate == SKIP   → log "Module {name}: SKIPPED — {reason}", mark checkbox, continue
  3. LOAD — read the module file and relevant reference files
  4. EXECUTE — read from <source>, write to <target>. Follow the module instructions, adapting to the chosen strategy
  5. COMPILE — run the compile command in <target> (`cd <target> && ./mvnw clean compile -DskipTests` for Maven, `cd <target> && ./gradlew clean compileJava -x test` for Gradle)
     Fails → load [modules/compile-fix.md](modules/compile-fix.md) and follow the retry procedure.
             If compile-fix reports MANUAL_REVIEW_REQUIRED (unresolved errors after 3 retries),
             ask the user whether to continue with the next module or stop the migration.
  6. LOG — mark checkbox as done

Running Individual Modules

To run a single module outside the full migration flow, read all the files in the module folder directly:

  • "Read modules/build/build.md and execute it"
  • "Run only the frontend module"
  • "Re-run the cleanup module"

The module will use the current <source> and <target> paths and the chosen strategy (if already decided). If no strategy has been chosen, the module will ask.

Step 2: Verify the Migration

All verification checks run against <target>. Run each check in order. A check fails = stop and fix before continuing.

#CheckCommand (run in <target>)Pass criteria
1Buildscd <target> && ./mvnw clean package -DskipTests / cd <target> && ./gradlew clean build -x testExit code 0, no compilation errors
2No Spring depsSearch <target> build file for org.springframeworkZero Spring deps (except Spring compat extensions if using that strategy)
3Has QuarkusSearch <target> build file for io.quarkusQuarkus BOM and at least one extension present
4Tests passcd <target> && ./mvnw test / cd <target> && ./gradlew testAll tests pass using @QuarkusTest
5Starts upcd <target> && ./mvnw quarkus:dev / cd <target> && ./gradlew quarkusDevApp starts, curl http://localhost:8080/q/health returns UP
6No leftover templatesSearch <target> for Thymeleaf/JSP referencesNone remaining (unless intentionally kept)

Step 3: Reporting

After verification completes, run the reporting module. It reads the verification results and all per-module data to produce:

  • <target>/migration-metadata/execution-metadata.json -- agent, model, tokens, cost, timing, verification results
  • <target>/migration-summary.md -- full 13-section migration report

The reporting module must run after verification so that it can include check results and record an accurate finished_at timestamp.

Console Summary

After the reporting module completes, present the following directly to the user so they get an immediate overview without opening the generated files.

Answer each question honestly:

  1. What migrated cleanly? Patterns that mapped 1:1.
  2. What required manual judgment? Non-obvious decisions made.
  3. What was left as TODO? Every // TODO: Migration required comment and why.
  4. Was any code removed? What, where, justification. Flag runtime risks.
  5. What checks failed initially? Failures from verification and how you fixed them.
  6. What's missing from the skill references? Mappings you had to figure out.

Then present the review as a structured report:

## Migration Report: [app-name]

### Summary
- Source: [source directory path]
- Target: [target directory path]
- Strategy: [Full Migration / Spring Compatibility]
- Agent: [AI agent name - e.g claude, pi, opencode, gemini, etc]
- Model: [model name — e.g. claude-sonnet-4-6, check system context]
- Modules completed: [X/8]
- Checks passed: [X/6]
- Token usage: [input tokens / output tokens — check session stats]
- Estimated cost: [~$X.XX — token counts × per-model pricing from anthropic.com/pricing]

### Changes by Module
| Module | Files changed | Key changes |
|--------|--------------|-------------|
| build | pom.xml or build.gradle(.kts), application.properties | ... |
| code | ... | ... |
| frontend | ... | ... |
| testing | ... | ... |

### Validation Results
| Check | Result | Notes |
|-------|--------|-------|
| Builds | PASS/FAIL | |
| No Spring deps | PASS/FAIL | |
| Has Quarkus | PASS/FAIL | |
| Tests pass | PASS/FAIL | |
| Starts up | PASS/FAIL | |
| No leftover templates | PASS/FAIL | |

### Unmigrated Code (TODOs)
| File | Line | What | Why not migrated |
|------|------|------|-----------------|

### Removed Code
| File | What was removed | Justification |
|------|-----------------|---------------|

### Skill Improvement Suggestions
- [Any missing mappings, unclear instructions, or edge cases discovered]

관련 작업