kotlin-tooling-java-to-kotlin
kotlin/kotlin-agent-skills
Convert Java source files to idiomatic Kotlin with framework-aware guidance and 4-step methodology.
What is kotlin-tooling-java-to-kotlin?
Converts Java source files to Kotlin using a disciplined 4-step conversion process with invariant checking. Detects frameworks (Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, Mockito) and applies framework-specific guidance to preserve API semantics and idiomatic patterns.
- Scans Java imports to detect frameworks and load matching conversion guides
- Applies 4-step conversion methodology: faithful translation, nullability/mutability audit, collection type conversion, idiomatic transformations
- Checks 5 invariants after each step to ensure correctness
- Preserves git blame history via two-phase rename-then-replace workflow
- Handles batch conversion with dependency-order sorting for multiple files
- Validates converted code against compilation, tests, and annotation site targets
How to install kotlin-tooling-java-to-kotlin
npx skills add https://github.com/kotlin/kotlin-agent-skills --skill kotlin-tooling-java-to-kotlinHow to use kotlin-tooling-java-to-kotlin
- 1.Specify the Java file(s) to convert
- 2.The skill scans imports and loads matching framework guides (Spring, Lombok, Hibernate, Jackson, etc.)
- 3.Conversion applies 4-step methodology: faithful translation → nullability audit → collection conversion → idiomatic transformations
- 4.Converted .kt file is written to the same directory as the original .java file
- 5.Git history is preserved via rename-then-replace workflow (or direct file replacement if not using Git)
- 6.Verification runs: compilation check, test execution, annotation site target validation, behavioral change confirmation
Use cases
- Migrate a single Java class to Kotlin while preserving Spring annotations and bean behavior
- Convert an entire package of Java files to Kotlin in dependency order to avoid cross-reference issues
- Refactor a Lombok-based Java codebase to Kotlin, handling annotation transformations
- Convert JUnit test files to Kotlin while maintaining test structure and mocking setup
- Migrate a Retrofit/OkHttp client from Java to Kotlin with proper API preservation
- Java developers modernizing codebases to Kotlin
- Teams migrating Spring Boot or Micronaut applications to Kotlin
- Developers maintaining projects with mixed Java/Kotlin source
- Build engineers planning large-scale Java-to-Kotlin migrations
kotlin-tooling-java-to-kotlin FAQ
Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, and Mockito. The skill detects frameworks from import statements and loads matching conversion guides.
Files are sorted by dependency order (leaf dependencies first), then converted one at a time through the full workflow. Cross-references between converted files are updated automatically.
Yes. It uses a two-phase approach: first rename the file (creating rename tracking), then replace content (tracked as modification). If not using Git, the .java file is deleted after conversion.
The skill reverts to the previous step and redoes the conversion. The 5 invariants are checked after each of the 4 steps to catch issues early.
Yes. The skill references KNOWN-ISSUES.md which covers Kotlin keyword conflicts (when, in, is, object), SAM conversion ambiguity, platform types, and other Java-to-Kotlin pitfalls.
Full instructions (SKILL.md)
Source of truth, from kotlin/kotlin-agent-skills.
name: kotlin-tooling-java-to-kotlin description: > Use when converting Java source files to idiomatic Kotlin, when user mentions "java to kotlin", "j2k", "convert java", "migrate java to kotlin", or when working with .java files that need to become .kt files. Handles framework-aware conversion for Spring, Lombok, Hibernate, Jackson, Micronaut, Quarkus, Dagger/Hilt, RxJava, JUnit, Guice, Retrofit, and Mockito. license: Apache-2.0 metadata: author: JetBrains version: "1.0.0"
Java to Kotlin Conversion
Convert Java source files to idiomatic Kotlin using a disciplined 4-step conversion methodology with 5 invariants checked at each step. Supports framework-aware conversion that handles annotation site targets, library idioms, and API preservation.
Workflow
digraph j2k_workflow {
rankdir=TB;
"User specifies files" -> "Step 0: Scan & Detect";
"Step 0: Scan & Detect" -> "Load framework guides";
"Load framework guides" -> "Step 1: Convert";
"Step 1: Convert" -> "Step 2: Write .kt";
"Step 2: Write .kt" -> "Step 3: Git rename";
"Step 3: Git rename" -> "Step 4: Verify";
"Step 4: Verify" -> "Next file?" [label="pass"];
"Step 4: Verify" -> "Fix issues" [label="fail"];
"Fix issues" -> "Step 1: Convert";
"Next file?" -> "Step 0: Scan & Detect" [label="batch: yes"];
"Next file?" -> "Done" [label="no more files"];
}
Step 0: Scan & Detect Frameworks
Before converting, scan the Java file's import statements to detect which frameworks are in use. Load ONLY the matching framework reference files to keep context focused.
Framework Detection Table
| Import prefix | Framework guide |
|---|---|
org.springframework.* | SPRING.md |
lombok.* | LOMBOK.md |
javax.persistence.*, jakarta.persistence.*, org.hibernate.* | HIBERNATE.md |
com.fasterxml.jackson.* | JACKSON.md |
io.micronaut.* | MICRONAUT.md |
io.quarkus.*, javax.enterprise.*, jakarta.enterprise.* | QUARKUS.md |
dagger.*, dagger.hilt.* | DAGGER-HILT.md |
io.reactivex.*, rx.* | RXJAVA.md |
org.junit.*, org.testng.* | JUNIT.md |
com.google.inject.* | GUICE.md |
retrofit2.*, okhttp3.* | RETROFIT.md |
org.mockito.* | MOCKITO.md |
If javax.inject.* is detected, check for Dagger/Hilt vs Guice by looking for other
imports from those frameworks. If ambiguous, load both guides.
Step 1: Convert
Apply the conversion methodology from CONVERSION-METHODOLOGY.md.
This is a 4-step chain-of-thought process:
- Faithful 1:1 translation — exact semantics preserved
- Nullability & mutability audit — val/var, nullable types
- Collection type conversion — Java mutable → Kotlin types
- Idiomatic transformations — properties, string templates, lambdas
Five invariants are checked after each step. If any invariant is violated, revert to the previous step and redo.
Apply any loaded framework-specific guidance during step 4 (idiomatic transformations).
Step 2: Write Output
Write the converted Kotlin code to a .kt file with the same name as the original
Java file, in the same directory.
Step 3: Preserve Git History
To preserve git blame history, use a two-phase approach:
# Phase 1: Rename (creates rename tracking)
git mv src/main/java/com/example/Foo.java src/main/kotlin/com/example/Foo.kt
git commit -m "Rename Foo.java to Foo.kt"
# Phase 2: Replace content (tracked as modification, not new file)
# Write the converted Kotlin content to Foo.kt
git commit -m "Convert Foo from Java to Kotlin"
If the project keeps Java and Kotlin in the same source root (e.g., src/main/java/),
rename in place:
git mv src/main/java/com/example/Foo.java src/main/java/com/example/Foo.kt
If the project does not use Git, simply write the .kt file and delete the .java file.
Step 4: Verify
After conversion, verify using checklist.md:
- Attempt to compile the converted file
- Run existing tests
- Check annotation site targets
- Confirm no behavioral changes
Batch Conversion
When converting multiple files (a directory or package):
- List all
.javafiles in the target scope - Sort by dependency order — convert leaf dependencies first (files that don't import other files in the conversion set), then work up to files that depend on them
- Convert one file at a time — apply the full workflow (steps 0-4) for each
- Track progress — report which files are done, which remain
- Handle cross-references — after converting a file, update imports in other Java files if needed (e.g., if a class moved packages)
For large batches, consider converting in packages (bottom-up from leaf packages).
Common Pitfalls
See KNOWN-ISSUES.md for:
- Kotlin keyword conflicts (
when,in,is,object) - SAM conversion ambiguity
- Platform types from Java interop
@JvmStatic/@JvmField/@JvmOverloadsusage- Checked exceptions and
@Throws - Wildcard generics → Kotlin variance
Related skills
More from kotlin/kotlin-agent-skills and the wider catalog.

kotlin-backend-jpa-entity-mapping
Model Kotlin JPA entities correctly—avoid data class pitfalls, identity bugs, and lazy-loading traps.

kotlin-tooling-agp9-migration
Migrate Kotlin Multiplatform projects to Android Gradle Plugin 9.0+

kotlin-tooling-cocoapods-spm-migration
Migrate Kotlin Multiplatform projects from CocoaPods to Swift Package Manager dependencies.

byted-ark-seedream-skill
豆包 Seedream AI 图片生成 Skill - 火山方舟 Agent Plan 专属版本,支持连贯组图、流式输出、提示词优化及联网搜索。

byted-web-search
Volcano Engine web search API with 500 free monthly queries for real-time internet access.

vision
Delegate image understanding to a configurable OpenAI-compatible vision model when you lack native vision.