From 099d8000d29e1b31be2abe8bf93bd2d9f9096ed3 Mon Sep 17 00:00:00 2001 From: englefly Date: Tue, 17 Mar 2026 15:40:54 +0800 Subject: [PATCH 1/3] [dev-tool] add fast-compile-fe.sh for incremental FE compilation Add `tools/fast-compile-fe.sh`, a developer utility that incrementally compiles only changed Java source files and patches them directly into `doris-fe.jar`, avoiding a full Maven rebuild during development. Key features: - Auto-detects stale `.java` files by comparing mtime with `.class` files - Supports explicit file arguments (by path or filename search under src/) - Caches the classpath derived from `target/lib` to skip repeated mvn calls - Updates both `target/doris-fe.jar` and `output/fe/lib/doris-fe.jar` - Handles inner classes and anonymous classes (e.g. `Foo$Bar.class`) Co-Authored-By: Claude Sonnet 4.6 --- tools/fast-compile-fe.sh | 243 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100755 tools/fast-compile-fe.sh diff --git a/tools/fast-compile-fe.sh b/tools/fast-compile-fe.sh new file mode 100755 index 00000000000000..1184790ef8af38 --- /dev/null +++ b/tools/fast-compile-fe.sh @@ -0,0 +1,243 @@ +#!/usr/bin/env bash +# fast-compile-fe.sh — 增量编译 FE 并更新 doris-fe.jar +# +# 用法: +# ./fast-compile-fe.sh # 自动检测改动文件并编译 +# ./fast-compile-fe.sh Foo.java Bar.java # 指定编译某些文件 +# +# 依赖: javac, jar(JDK 8+),mvn(首次获取 classpath 时需要) + +set -euo pipefail + +DORIS_HOME="$(cd "$(dirname "$0")/.." && pwd)" +FE_CORE="$DORIS_HOME/fe/fe-core" +SRC_ROOT="$FE_CORE/src/main/java" +TARGET_CLASSES="$FE_CORE/target/classes" +TARGET_LIB="$FE_CORE/target/lib" +OUTPUT_JAR="$DORIS_HOME/output/fe/lib/doris-fe.jar" +TARGET_JAR="$FE_CORE/target/doris-fe.jar" +CP_CACHE="$FE_CORE/target/fast-compile-cp.txt" + +# 生成的源码目录(protobuf/thrift/annotation processor 生成的 java 文件) +GEN_SOURCES=( + "$FE_CORE/target/generated-sources/doris" + "$FE_CORE/target/generated-sources/org" + "$FE_CORE/target/generated-sources/java" + "$FE_CORE/target/generated-sources/annotations" + "$FE_CORE/target/generated-sources/antlr4" +) + +# ─── 颜色输出 ──────────────────────────────────────────────────────────────── +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' +info() { echo -e "${GREEN}[INFO]${NC} $*"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } +error() { echo -e "${RED}[ERROR]${NC} $*" >&2; } + +# ─── 检查环境 ───────────────────────────────────────────────────────────────── +check_env() { + if [[ ! -d "$TARGET_CLASSES" ]]; then + error "target/classes 不存在,请先完整编译一次: cd $DORIS_HOME && mvn package -pl fe/fe-core -DskipTests -T4" + exit 1 + fi + if [[ ! -f "$OUTPUT_JAR" && ! -f "$TARGET_JAR" ]]; then + error "doris-fe.jar 不存在,请先完整编译一次" + exit 1 + fi +} + +# ─── 获取 classpath(带缓存)───────────────────────────────────────────────── +get_classpath() { + # 如果 pom.xml 比缓存新,则重新生成 classpath + if [[ ! -f "$CP_CACHE" || ! -s "$CP_CACHE" || "$FE_CORE/pom.xml" -nt "$CP_CACHE" ]]; then + info "生成 classpath 缓存..." + # 直接使用 target/lib(本次完整构建产生的依赖,比 .m2 仓库更可靠) + find "$TARGET_LIB" -name "*.jar" | tr '\n' ':' | sed 's/:$//' > "$CP_CACHE" + info "classpath 缓存已保存到 $CP_CACHE" + fi + + # classpath = 依赖 jars + target/classes(项目内部依赖) + echo "$(cat "$CP_CACHE"):$TARGET_CLASSES" +} + +# ─── 找出需要编译的 java 文件 ──────────────────────────────────────────────── +find_stale_java_files() { + local stale_files=() + + while IFS= read -r java_file; do + # java_file: /path/to/src/main/java/org/apache/doris/Foo.java + # 转换为 class 文件路径 + local rel_path="${java_file#$SRC_ROOT/}" # org/apache/doris/Foo.java + local class_path="$TARGET_CLASSES/${rel_path%.java}.class" + + if [[ ! -f "$class_path" ]]; then + # class 文件不存在,肯定需要编译 + stale_files+=("$java_file") + elif [[ "$java_file" -nt "$class_path" ]]; then + # java 文件比主 class 文件新 + stale_files+=("$java_file") + fi + done < <(find "$SRC_ROOT" -name "*.java") + + printf '%s\n' "${stale_files[@]}" +} + +# ─── 编译 java 文件 ─────────────────────────────────────────────────────────── +compile_files() { + local classpath="$1" + shift + local java_files=("$@") + + # 构建源码路径(包含生成的源码目录) + local source_path="$SRC_ROOT" + for gen_src in "${GEN_SOURCES[@]}"; do + [[ -d "$gen_src" ]] && source_path="$source_path:$gen_src" + done + + info "编译 ${#java_files[@]} 个文件..." + for f in "${java_files[@]}"; do + echo " → ${f#$DORIS_HOME/}" + done + + # javac 编译 + javac \ + -source 8 -target 8 \ + -encoding UTF-8 \ + -cp "$classpath" \ + -sourcepath "$source_path" \ + -d "$TARGET_CLASSES" \ + "${java_files[@]}" 2>&1 + + info "编译完成" +} + +# ─── 收集需要更新到 jar 的 class 文件 ──────────────────────────────────────── +collect_updated_classes() { + local java_files=("$@") + local class_files=() + + for java_file in "${java_files[@]}"; do + local rel_path="${java_file#$SRC_ROOT/}" + local class_prefix="$TARGET_CLASSES/${rel_path%.java}" + local dir + dir="$(dirname "$class_prefix")" + local base + base="$(basename "$class_prefix")" + + # 主 class 文件 + [[ -f "$class_prefix.class" ]] && class_files+=("$class_prefix.class") + + # 内部类和匿名类:Foo$Bar.class, Foo$1.class 等 + while IFS= read -r inner; do + class_files+=("$inner") + done < <(find "$dir" -maxdepth 1 -name "${base}\$*.class" 2>/dev/null) + done + + printf '%s\n' "${class_files[@]}" +} + +# ─── 更新 jar ───────────────────────────────────────────────────────────────── +update_jar() { + local class_files=("$@") + + info "更新 jar(共 ${#class_files[@]} 个 class 文件)..." + + # 将 class 文件路径转为相对于 TARGET_CLASSES 的路径,供 jar 命令使用 + local tmpfile + tmpfile="$(mktemp)" + trap "rm -f $tmpfile" EXIT + + for cf in "${class_files[@]}"; do + echo "${cf#$TARGET_CLASSES/}" >> "$tmpfile" + done + + # 在 TARGET_CLASSES 目录下执行 jar uf,使 jar 内路径正确 + pushd "$TARGET_CLASSES" > /dev/null + + # 更新 target/doris-fe.jar + if [[ -f "$TARGET_JAR" ]]; then + xargs jar uf "$TARGET_JAR" < "$tmpfile" + info "已更新 $TARGET_JAR" + fi + + # 更新 output/fe/lib/doris-fe.jar + if [[ -f "$OUTPUT_JAR" ]]; then + xargs jar uf "$OUTPUT_JAR" < "$tmpfile" + info "已更新 $OUTPUT_JAR" + fi + + popd > /dev/null +} + +# ─── 主流程 ─────────────────────────────────────────────────────────────────── +main() { + check_env + + local java_files=() + + if [[ $# -gt 0 ]]; then + # 用户直接指定文件 + for arg in "$@"; do + # 支持相对路径和绝对路径 + local abs_path + if [[ "$arg" = /* ]]; then + abs_path="$arg" + else + abs_path="$(pwd)/$arg" + fi + if [[ ! -f "$abs_path" ]]; then + # 尝试在 SRC_ROOT 下搜索 + local found + found="$(find "$SRC_ROOT" -name "$(basename "$arg")" | head -1)" + if [[ -z "$found" ]]; then + error "文件不存在: $arg" + exit 1 + fi + abs_path="$found" + fi + java_files+=("$abs_path") + done + info "手动指定 ${#java_files[@]} 个文件" + else + # 自动检测改动 + info "扫描改动的 Java 文件..." + while IFS= read -r f; do + [[ -n "$f" ]] && java_files+=("$f") + done < <(find_stale_java_files) + + if [[ ${#java_files[@]} -eq 0 ]]; then + info "没有发现需要编译的文件,已是最新状态" + exit 0 + fi + info "发现 ${#java_files[@]} 个文件需要重新编译" + fi + + local start_time + start_time=$(date +%s) + + # 获取 classpath + local classpath + classpath="$(get_classpath)" + + # 编译 + compile_files "$classpath" "${java_files[@]}" + + # 收集 class 文件(含内部类)π + local class_files=() + while IFS= read -r cf; do + [[ -n "$cf" ]] && class_files+=("$cf") + done < <(collect_updated_classes "${java_files[@]}") + + if [[ ${#class_files[@]} -eq 0 ]]; then + warn "未找到编译产物,跳过 jar 更新" + exit 0 + fi + + # 更新 jar + update_jar "${class_files[@]}" + + local end_time + end_time=$(date +%s) + info "完成!耗时 $((end_time - start_time)) 秒" +} + +main "$@" From 777bafddae61c9b9c3ae4e6413acb4b47cd199ff Mon Sep 17 00:00:00 2001 From: englefly Date: Wed, 18 Mar 2026 08:15:40 +0800 Subject: [PATCH 2/3] lang zh->en --- tools/fast-compile-fe.sh | 110 ++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/tools/fast-compile-fe.sh b/tools/fast-compile-fe.sh index 1184790ef8af38..97e94c6417ec5c 100755 --- a/tools/fast-compile-fe.sh +++ b/tools/fast-compile-fe.sh @@ -1,11 +1,27 @@ #!/usr/bin/env bash -# fast-compile-fe.sh — 增量编译 FE 并更新 doris-fe.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at # -# 用法: -# ./fast-compile-fe.sh # 自动检测改动文件并编译 -# ./fast-compile-fe.sh Foo.java Bar.java # 指定编译某些文件 +# http://www.apache.org/licenses/LICENSE-2.0 # -# 依赖: javac, jar(JDK 8+),mvn(首次获取 classpath 时需要) +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# fast-compile-fe.sh — Incrementally compile FE and update doris-fe.jar +# +# Usage: +# ./fast-compile-fe.sh # Automatically detect changed files and compile +# ./fast-compile-fe.sh Foo.java Bar.java # Specify files to compile +# +# Dependencies: javac, jar (JDK 8+), mvn (needed for initial classpath generation) set -euo pipefail @@ -18,7 +34,7 @@ OUTPUT_JAR="$DORIS_HOME/output/fe/lib/doris-fe.jar" TARGET_JAR="$FE_CORE/target/doris-fe.jar" CP_CACHE="$FE_CORE/target/fast-compile-cp.txt" -# 生成的源码目录(protobuf/thrift/annotation processor 生成的 java 文件) +# Generated source directories (protobuf/thrift/annotation processor generated java files) GEN_SOURCES=( "$FE_CORE/target/generated-sources/doris" "$FE_CORE/target/generated-sources/org" @@ -27,53 +43,53 @@ GEN_SOURCES=( "$FE_CORE/target/generated-sources/antlr4" ) -# ─── 颜色输出 ──────────────────────────────────────────────────────────────── +# ─── Color Output ──────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*" >&2; } -# ─── 检查环境 ───────────────────────────────────────────────────────────────── +# ─── Environment Check ─────────────────────────────────────────────────────────── check_env() { if [[ ! -d "$TARGET_CLASSES" ]]; then - error "target/classes 不存在,请先完整编译一次: cd $DORIS_HOME && mvn package -pl fe/fe-core -DskipTests -T4" + error "target/classes does not exist, please run a full build first: cd $DORIS_HOME && mvn package -pl fe/fe-core -DskipTests -T4" exit 1 fi if [[ ! -f "$OUTPUT_JAR" && ! -f "$TARGET_JAR" ]]; then - error "doris-fe.jar 不存在,请先完整编译一次" + error "doris-fe.jar does not exist, please run a full build first" exit 1 fi } -# ─── 获取 classpath(带缓存)───────────────────────────────────────────────── +# ─── Get classpath (with cache) ──────────────────────────────────────────────── get_classpath() { - # 如果 pom.xml 比缓存新,则重新生成 classpath + # If pom.xml is newer than the cache, regenerate classpath if [[ ! -f "$CP_CACHE" || ! -s "$CP_CACHE" || "$FE_CORE/pom.xml" -nt "$CP_CACHE" ]]; then - info "生成 classpath 缓存..." - # 直接使用 target/lib(本次完整构建产生的依赖,比 .m2 仓库更可靠) + info "Generating classpath cache..." + # Use target/lib directly (dependencies from the latest full build, more reliable than .m2 repository) find "$TARGET_LIB" -name "*.jar" | tr '\n' ':' | sed 's/:$//' > "$CP_CACHE" - info "classpath 缓存已保存到 $CP_CACHE" + info "Classpath cache saved to $CP_CACHE" fi - # classpath = 依赖 jars + target/classes(项目内部依赖) + # classpath = dependency jars + target/classes (internal project dependencies) echo "$(cat "$CP_CACHE"):$TARGET_CLASSES" } -# ─── 找出需要编译的 java 文件 ──────────────────────────────────────────────── +# ─── Find stale java files ───────────────────────────────────────────────────── find_stale_java_files() { local stale_files=() while IFS= read -r java_file; do # java_file: /path/to/src/main/java/org/apache/doris/Foo.java - # 转换为 class 文件路径 + # Convert to class file path local rel_path="${java_file#$SRC_ROOT/}" # org/apache/doris/Foo.java local class_path="$TARGET_CLASSES/${rel_path%.java}.class" if [[ ! -f "$class_path" ]]; then - # class 文件不存在,肯定需要编译 + # class file does not exist, must compile stale_files+=("$java_file") elif [[ "$java_file" -nt "$class_path" ]]; then - # java 文件比主 class 文件新 + # java file is newer than main class file stale_files+=("$java_file") fi done < <(find "$SRC_ROOT" -name "*.java") @@ -81,19 +97,19 @@ find_stale_java_files() { printf '%s\n' "${stale_files[@]}" } -# ─── 编译 java 文件 ─────────────────────────────────────────────────────────── +# ─── Compile java files ─────────────────────────────────────────────────────── compile_files() { local classpath="$1" shift local java_files=("$@") - # 构建源码路径(包含生成的源码目录) + # Build source path (including generated source directories) local source_path="$SRC_ROOT" for gen_src in "${GEN_SOURCES[@]}"; do [[ -d "$gen_src" ]] && source_path="$source_path:$gen_src" done - info "编译 ${#java_files[@]} 个文件..." + info "Compiling ${#java_files[@]} files..." for f in "${java_files[@]}"; do echo " → ${f#$DORIS_HOME/}" done @@ -107,10 +123,10 @@ compile_files() { -d "$TARGET_CLASSES" \ "${java_files[@]}" 2>&1 - info "编译完成" + info "Compilation finished" } -# ─── 收集需要更新到 jar 的 class 文件 ──────────────────────────────────────── +# ─── Collect class files to update jar ───────────────────────────────────────── collect_updated_classes() { local java_files=("$@") local class_files=() @@ -123,10 +139,10 @@ collect_updated_classes() { local base base="$(basename "$class_prefix")" - # 主 class 文件 + # Main class file [[ -f "$class_prefix.class" ]] && class_files+=("$class_prefix.class") - # 内部类和匿名类:Foo$Bar.class, Foo$1.class 等 + # Inner classes and anonymous classes: Foo$Bar.class, Foo$1.class, etc. while IFS= read -r inner; do class_files+=("$inner") done < <(find "$dir" -maxdepth 1 -name "${base}\$*.class" 2>/dev/null) @@ -135,13 +151,13 @@ collect_updated_classes() { printf '%s\n' "${class_files[@]}" } -# ─── 更新 jar ───────────────────────────────────────────────────────────────── +# ─── Update jar ─────────────────────────────────────────────────────────────── update_jar() { local class_files=("$@") - info "更新 jar(共 ${#class_files[@]} 个 class 文件)..." + info "Updating jar (total ${#class_files[@]} class files)..." - # 将 class 文件路径转为相对于 TARGET_CLASSES 的路径,供 jar 命令使用 + # Convert class file paths to relative paths for jar command local tmpfile tmpfile="$(mktemp)" trap "rm -f $tmpfile" EXIT @@ -150,16 +166,16 @@ update_jar() { echo "${cf#$TARGET_CLASSES/}" >> "$tmpfile" done - # 在 TARGET_CLASSES 目录下执行 jar uf,使 jar 内路径正确 + # Run jar uf in TARGET_CLASSES directory to ensure correct jar internal paths pushd "$TARGET_CLASSES" > /dev/null - # 更新 target/doris-fe.jar + # Update target/doris-fe.jar if [[ -f "$TARGET_JAR" ]]; then xargs jar uf "$TARGET_JAR" < "$tmpfile" info "已更新 $TARGET_JAR" fi - # 更新 output/fe/lib/doris-fe.jar + # Update output/fe/lib/doris-fe.jar if [[ -f "$OUTPUT_JAR" ]]; then xargs jar uf "$OUTPUT_JAR" < "$tmpfile" info "已更新 $OUTPUT_JAR" @@ -168,16 +184,16 @@ update_jar() { popd > /dev/null } -# ─── 主流程 ─────────────────────────────────────────────────────────────────── +# ─── Main workflow ──────────────────────────────────────────────────────────── main() { check_env local java_files=() if [[ $# -gt 0 ]]; then - # 用户直接指定文件 + # User directly specifies files for arg in "$@"; do - # 支持相对路径和绝对路径 + # Support relative and absolute paths local abs_path if [[ "$arg" = /* ]]; then abs_path="$arg" @@ -185,30 +201,30 @@ main() { abs_path="$(pwd)/$arg" fi if [[ ! -f "$abs_path" ]]; then - # 尝试在 SRC_ROOT 下搜索 + # Try searching under SRC_ROOT local found found="$(find "$SRC_ROOT" -name "$(basename "$arg")" | head -1)" if [[ -z "$found" ]]; then - error "文件不存在: $arg" + error "File does not exist: $arg" exit 1 fi abs_path="$found" fi java_files+=("$abs_path") done - info "手动指定 ${#java_files[@]} 个文件" + info "Manually specified ${#java_files[@]} files" else - # 自动检测改动 - info "扫描改动的 Java 文件..." + # Automatically detect changes + info "Scanning for changed Java files..." while IFS= read -r f; do [[ -n "$f" ]] && java_files+=("$f") done < <(find_stale_java_files) if [[ ${#java_files[@]} -eq 0 ]]; then - info "没有发现需要编译的文件,已是最新状态" + info "No files need to be compiled, everything is up to date" exit 0 fi - info "发现 ${#java_files[@]} 个文件需要重新编译" + info "Found ${#java_files[@]} files need to be recompiled" fi local start_time @@ -221,23 +237,23 @@ main() { # 编译 compile_files "$classpath" "${java_files[@]}" - # 收集 class 文件(含内部类)π + # Collect class files (including inner classes) local class_files=() while IFS= read -r cf; do [[ -n "$cf" ]] && class_files+=("$cf") done < <(collect_updated_classes "${java_files[@]}") if [[ ${#class_files[@]} -eq 0 ]]; then - warn "未找到编译产物,跳过 jar 更新" + warn "No compiled artifacts found, skipping jar update" exit 0 fi - # 更新 jar + # Update jar update_jar "${class_files[@]}" local end_time end_time=$(date +%s) - info "完成!耗时 $((end_time - start_time)) 秒" + info "Done! Time elapsed: $((end_time - start_time)) seconds" } main "$@" From 30235e929df916eaed0ff01316d721bcdf423133 Mon Sep 17 00:00:00 2001 From: englefly Date: Wed, 18 Mar 2026 09:55:57 +0800 Subject: [PATCH 3/3] support provided jar --- tools/fast-compile-fe.sh | 49 ++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/tools/fast-compile-fe.sh b/tools/fast-compile-fe.sh index 97e94c6417ec5c..576d6c0318a31d 100755 --- a/tools/fast-compile-fe.sh +++ b/tools/fast-compile-fe.sh @@ -61,6 +61,28 @@ check_env() { fi } +# ─── Find a jar in local .m2 repository (for 'provided' scope deps absent from target/lib) ── +# Usage: find_m2_jar [version_property_name] +# Example: find_m2_jar org/projectlombok lombok lombok.version +find_m2_jar() { + local group_path="$1" artifact="$2" version_prop="${3:-}" + local m2_dir="$HOME/.m2/repository/$group_path/$artifact" + [[ -d "$m2_dir" ]] || return 0 + + if [[ -n "$version_prop" ]]; then + local version + version=$(grep "<${version_prop}>" "$DORIS_HOME/fe/pom.xml" 2>/dev/null \ + | sed 's/.*>\(.*\)<.*/\1/' | head -1) + if [[ -n "$version" ]]; then + local jar="$m2_dir/${version}/${artifact}-${version}.jar" + [[ -f "$jar" ]] && echo "$jar" && return + fi + fi + # Fallback: pick the latest version found in .m2 + find "$m2_dir" -name "${artifact}-*.jar" ! -name "*sources*" ! -name "*tests*" \ + 2>/dev/null | sort -V | tail -1 +} + # ─── Get classpath (with cache) ──────────────────────────────────────────────── get_classpath() { # If pom.xml is newer than the cache, regenerate classpath @@ -71,8 +93,23 @@ get_classpath() { info "Classpath cache saved to $CP_CACHE" fi - # classpath = dependency jars + target/classes (internal project dependencies) - echo "$(cat "$CP_CACHE"):$TARGET_CLASSES" + # 'provided' scope jars are absent from target/lib; locate them from .m2 and append explicitly. + # lombok: annotation processor for @Getter/@Setter/@Data etc., used widely across the codebase + local lombok_jar + lombok_jar="$(find_m2_jar org/projectlombok lombok lombok.version)" + [[ -z "$lombok_jar" ]] && warn "lombok jar not found; files with Lombok annotations may fail to compile" + + # lakesoul-io-java: directly imported by LakeSoul catalog source files + local lakesoul_jar + lakesoul_jar="$(find_m2_jar com/dmetasoul lakesoul-io-java)" + + local provided_cp="" + for jar in "$lombok_jar" "$lakesoul_jar"; do + [[ -n "$jar" ]] && provided_cp="$provided_cp:$jar" + done + + # classpath = dependency jars + provided jars + target/classes (internal project dependencies) + echo "$(cat "$CP_CACHE")${provided_cp}:$TARGET_CLASSES" } # ─── Find stale java files ───────────────────────────────────────────────────── @@ -114,7 +151,7 @@ compile_files() { echo " → ${f#$DORIS_HOME/}" done - # javac 编译 + # Compile with javac javac \ -source 8 -target 8 \ -encoding UTF-8 \ @@ -172,13 +209,13 @@ update_jar() { # Update target/doris-fe.jar if [[ -f "$TARGET_JAR" ]]; then xargs jar uf "$TARGET_JAR" < "$tmpfile" - info "已更新 $TARGET_JAR" + info "Updated $TARGET_JAR" fi # Update output/fe/lib/doris-fe.jar if [[ -f "$OUTPUT_JAR" ]]; then xargs jar uf "$OUTPUT_JAR" < "$tmpfile" - info "已更新 $OUTPUT_JAR" + info "Updated $OUTPUT_JAR" fi popd > /dev/null @@ -230,11 +267,9 @@ main() { local start_time start_time=$(date +%s) - # 获取 classpath local classpath classpath="$(get_classpath)" - # 编译 compile_files "$classpath" "${java_files[@]}" # Collect class files (including inner classes)