Skip to content
kaiv2 edited this page May 27, 2025 · 4 revisions

NVIM IDE

如何编译 java 开发环境

#!/bin/bash

workdir=$(pwd)
project=$1

jdtls() {
    # eclipse-jdtls
    if [[ -d "eclipse.jdt.ls" ]]; then
      echo "eclipse.jdt.ls already exists, skipping clone."
      cd eclipse.jdt.ls
      git pull
    else
      git clone https://github.com/eclipse-jdtls/eclipse.jdt.ls.git
      cd eclipse.jdt.ls
    fi
    mvn clean verify -U -DskipTests -Declipse.jdt.ls.skipGradleChecksums
    cd ${workdir}
    echo "JDTLS_HOME=${workdir}/eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository"
}

java_debug() {
    # java-debug
    if [[ -d "java-debug" ]]; then
      echo "java-debug already exists, skipping clone."
      cd java-debug
      git pull
    else
      git clone https://github.com/microsoft/java-debug.git
      cd java-debug
    fi
    mvn clean package -DskipTests
    cd ${workdir}
    echo "JDTLS_JAVA_DEBUG_PATH=${workdir}/java-debug/com.microsoft.java.debug.plugin/target/"
}

java_test() {
    # java-test
    if [[ -d "vscode-java-test" ]]; then
      echo "vscode-java-test already exists, skipping clone."
      cd vscode-java-test/java-extension
      git pull
    else
      git clone https://github.com/microsoft/vscode-java-test.git
      cd vscode-java-test/java-extension
    fi
    mvn clean package -DskipTests -Djdk.xml.totalEntitySizeLimit=1000000 -Djdk.xml.maxGeneralEntitySizeLimit=1000000

    cd ..
    # 删除 server 目录
    rm -rf server
    # 定义 serverDir 路径
    serverDir=$(realpath "java-extension")
    # 定义 bundle 列表
    bundleList=(
        "org.eclipse.jdt.junit4.runtime_"
        "org.eclipse.jdt.junit5.runtime_"
        "junit-jupiter-api"
        "junit-jupiter-engine"
        "junit-jupiter-migrationsupport"
        "junit-jupiter-params"
        "junit-vintage-engine"
        "org.opentest4j"
        "junit-platform-commons"
        "junit-platform-engine"
        "junit-platform-launcher"
        "junit-platform-runner"
        "junit-platform-suite-api"
        "junit-platform-suite-commons"
        "junit-platform-suite-engine"
        "org.apiguardian.api"
        "org.jacoco.core"
    )

    # 创建 server 目录
    mkdir -p server
    # 第一个 copy 操作 - 复制 .jar 文件
    find "$serverDir/com.microsoft.java.test.plugin/target" -type f -name "*.jar" -exec cp {} server/ \;
    # 第二个 copy 操作 - 复制特定 jar 文件
    find "$serverDir/com.microsoft.java.test.runner/target" -type f -name "*jar-with-dependencies.jar" -exec cp {} server/ \;

    # 第三个 copy 操作 - 复制 bundle 列表中的文件
    for bundleName in "${bundleList[@]}"; do
        find "$serverDir/com.microsoft.java.test.plugin.site/target/repository/plugins" -type f -name "$bundleName*" -exec cp {} server/ \;
    done
    cd ${workdir}
    echo "JDTLS_JAVA_TEST_PATH=${workdir}/vscode-java-test/server"
}

java_dependency() {
    # java-dependency
    if [[ -d "vscode-java-dependency" ]]; then
      echo "vscode-java-dependency already exists, skipping clone."
      cd vscode-java-dependency/jdtls.ext
      git pull
    else
      git clone https://github.com/microsoft/vscode-java-dependency.git
      cd vscode-java-dependency/jdtls.ext
    fi
    mvn clean package -DskipTests -Djdk.xml.totalEntitySizeLimit=1000000 -Djdk.xml.maxGeneralEntitySizeLimit=1000000
    cd ${workdir}
    echo "JDTLS_JAVA_DEPENDENCY_PATH=${workdir}/vscode-java-dependency/jdtls.ext/com.microsoft.jdtls.ext.core/target"
}

java_decompiler() {
    # java-decompiler
    if [[ -d "vscode-java-decompiler" ]]; then
      echo "vscode-java-decompiler already exists, skipping clone."
      cd vscode-java-decompiler
      git pull
    else
        git clone https://github.com/dgileadi/vscode-java-decompiler.git
    fi
    cd ${workdir}
    echo "JDTLS_JAVA_DECOMPILER_PATH=${workdir}/vscode-java-decompiler/server"
}

lombok() {
    # lombok jar
    if [[ -f "lombok.jar" ]]; then
      echo "lombok.jar already exists, skipping download."
    else
      curl -L -O https://projectlombok.org/downloads/lombok.jar
    fi
}

spring_tools() {
    # spring-tools
    if [[ -d "spring-tools" ]]; then
      echo "spring-tools already exists, skipping clone."
      cd spring-tools/headless-services
      git pull
    else
      git clone https://github.com/spring-projects/spring-tools.git
      cd spring-tools/headless-services
    fi
    modules=spring-boot-language-server,sts-gradle-model-plugin,:org.springframework.tooling.gradle,:org.springframework.tooling.jdt.ls.extension,:org.springframework.tooling.jdt.ls.commons,:org.springframework.tooling.jdt.ls.commons.test
    mvn \
        -DtrimStackTrace=false \
        -DskipTests \
        -Djdk.xml.totalEntitySizeLimit=1000000 \
        -Djdk.xml.maxGeneralEntitySizeLimit=1000000 \
        -f pom.xml \
        -pl $modules \
        -am \
        -B \
        clean install
    # Clean old jars
    rm -fr ${workdir}/spring-tools/jars
    mkdir -p ${workdir}/spring-tools/jars

    #Clean old LS folder
    rm -fr ${workdir}/spring-tools/language-server
    mkdir -p ${workdir}/spring-tools/language-server

    # Extract LS JAR
    cd ${workdir}/spring-tools/headless-services/spring-boot-language-server/target
    server_jar_file=$(find . -name '*-exec.jar');
    java -Djarmode=tools -jar $server_jar_file extract --destination ${workdir}/spring-tools/language-server

    # JDT LS Extension
    cd ${workdir}/spring-tools/headless-services/jdt-ls-extension
    find . -name "*-sources.jar" -delete
    cp org.springframework.tooling.jdt.ls.extension/target/*.jar ${workdir}/spring-tools/jars/jdt-ls-extension.jar
    cp org.springframework.tooling.jdt.ls.commons/target/*.jar ${workdir}/spring-tools/jars/jdt-ls-commons.jar
    cp org.springframework.tooling.gradle/target/*.jar ${workdir}/spring-tools/jars/sts-gradle-tooling.jar

    # Copy Reactor dependency bundles
    cp org.springframework.tooling.jdt.ls.commons/target/dependencies/io.projectreactor.reactor-core.jar ${workdir}/spring-tools/jars/
    cp org.springframework.tooling.jdt.ls.commons/target/dependencies/org.reactivestreams.reactive-streams.jar ${workdir}/spring-tools/jars/

    cd ${workdir}
    echo "JDTLS_SPRING_TOOLS_PATH=${workdir}/spring-tools"
}

case $project in
  jdtls)
    jdtls
    ;;
  java-debug)
    java_debug
    ;;
  java-test)
    java_test
    ;;
  java-dependency)
    java_dependency
    ;;
  java-decompiler)
    java_decompiler
    ;;
  spring-tools)
    spring_tools
    ;;
  lombok)
    lombok
    ;;
  all)
    jdtls
    java_debug
    java_test
    java_dependency
    java_decompiler
    spring_tools
    lombok
    ;;
  env)
    echo "JDTLS_HOME=${workdir}/eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository"
    echo "JDTLS_JAVA_DEBUG_PATH=${workdir}/java-debug/com.microsoft.java.debug.plugin/target/"
    echo "JDTLS_JAVA_TEST_PATH=${workdir}/vscode-java-test/server"
    echo "JDTLS_JAVA_DEPENDENCY_PATH=${workdir}/vscode-java-dependency/jdtls.ext/com.microsoft.jdtls.ext.core/target"
    echo "JDTLS_JAVA_DECOMPILER_PATH=${workdir}/vscode-java-decompiler/server"
    echo "JDTLS_SPRING_TOOLS_PATH=${workdir}/spring-tools"
    ;;
  *)
    echo "Usage: $0 {jdtls|java-debug|java-test|java-dependency|java-decompiler|spring-tools|lombok|all|env}"
esac
Clone this wiki locally