Java Development Setup, SDKMAN, Gradle, VS Code
 · 約2分
SDKMAN! is a popular Java version manager for developers. It allows you to easily install, switch between, and manage multiple Java versions and development tools.
Install SDKMAN!
# install
curl -s "https://get.sdkman.io" | bash
# init
source "$HOME/.sdkman/bin/sdkman-init.sh"
Install Java
# list available Java versions
sdk list java
# Install Java 21
sdk install Java 21.0.1-tem
# Set as default
sdk default java 21.0.1-tem
# Verify installation
java -version
Fix JAVA_HOME Environment Variable
SDKMAN! sometimes doesn't set JAVA_HOME automatically. Add this to your shell configuration:
# For zsh (default on newer macOS)
echo 'export JAVA_HOME="$SDKMAN_DIR/candidates/java/current"' >> ~/.zshrc
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Verify JAVA_HOME is set
echo $JAVA_HOME
Install Gradle
sdk install gradle
gradle --verion
Install Spring boot
sdk install springboot
Start coding Java with VSCode
Install the Extension Pack for Java which includes 7 essential extensions:
- Language Support for Java
 - Debugger for Java
 - Test Runner for Java
 - Maven for Java
 - Project Manager for Java
 - Visual Studio IntelliCode
 - Gradle for Java
 
Update user settings: Command + Shift + P > Open user settings (JSON) with the following settings:
{
  // Java Runtime Configuration
  "java.jdt.ls.java.home": "${env:JAVA_HOME}",
  "java.configuration.runtimes": [
    {
      "name": "JavaSE-21",
      "path": "${env:JAVA_HOME}",
      "default": true
    }
  ],
  // Java Language Server Settings
  "java.configuration.detectJdksAtStart": true,
  "java.configuration.updateBuildConfiguration": "automatic",
  "java.server.launchMode": "Standard",
  "java.autobuild.enabled": true,
  "java.maxConcurrentBuilds": 1,
    // Code Completion and Analysis
  "java.completion.enabled": true,
  "java.completion.guessMethodArguments": true,
  "java.completion.favoriteStaticMembers": [
    "org.junit.jupiter.api.Assertions.*",
    "org.mockito.Mockito.*",
    "org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*",
    "org.springframework.test.web.servlet.result.MockMvcResultMatchers.*"
  ],
  "java.compile.nullAnalysis.mode": "automatic",
  "java.sources.organizeImports.staticStarThreshold": 5,
  "java.sources.organizeImports.starThreshold": 5,
  // Code Formatting
  "java.format.enabled": true,
  "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",
  "java.format.settings.profile": "GoogleStyle",
  "java.format.comments.enabled": true,
  // Gradle Settings
  "java.import.gradle.enabled": true,
  "java.import.gradle.wrapper.enabled": true,
  "java.import.gradle.offline.enabled": false,
  "java.import.gradle.arguments": "--refresh-dependencies",
  "gradle.javaDebug.cleanOutput": true,
  "gradle.debug": false,
  // Testing
  "java.test.defaultConfig": "",
  "java.test.config": {},
  
  // Debugging
  "java.debug.logLevel": "warn",
  "java.debug.settings.enableRunDebugCodeLens": true,
  "java.debug.settings.showHex": false,
  "java.debug.settings.showStaticVariables": false,
  "java.debug.settings.showQualifiedNames": false,
  "java.debug.settings.maxStringLength": 0,
  "java.debug.settings.exceptionBreakpoint.skipClasses": [
    "$JDK",
    "junit.*",
    "org.junit.*",
    "org.springframework.*"
  ],
  
  // Code Lens
  "java.references.includeAccessors": true,
  "java.references.includeDecompiledSources": true,
  "java.implementationsCodeLens.enabled": true,
  "java.referencesCodeLens.enabled": true,
  // Error Reporting and Telemetry
  "java.errors.incompleteClasspath.severity": "warning",
  "java.telemetry.enabled": false,
  
  // Performance
  "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m",
  
  // Code Completion Filtering (keep packages you don't commonly use out of suggestions)
  "java.completion.filteredTypes": [
    "java.awt.*",
    "com.sun.*",
    "sun.*",
    "jdk.*",
    "org.graalvm.*",
    "io.micrometer.shaded.*",
    "javax.swing.*"
  ],
  // Spring Boot specific (useful for microservices)
  "spring-boot.ls.checkjvm": false,
  "spring.initializr.defaultLanguage": "Java",
  "spring.initializr.defaultJavaVersion": "21",
  "spring.initializr.defaultPackaging": "Jar",
}
