#!/usr/bin/env bash # 仅编译本仓库(maven-cw-elevator-application),依赖从 Nexus 拉取,避免使用全局 ~/.m2 里 # 其它反编译工程 mvn install 产生的同坐标覆盖。 # # 方案要点: # - 使用独立 maven.repo.local(默认:仓库根目录下 .m2-elevator-nexus-only),与 ~/.m2 隔离。 # - Nexus 常缺聚合父 POM cloudwalk-cloud-common:脚本会(1)尝试从全局 ~/.m2 复制该目录; # (2)若仍缺,且存在相邻仓库 maven-cloudwalk-legacy-public/cloudwalk-cloud-common,则自动 # mvn -N install 到隔离库(仅父 POM,不编其它反编译模块)。 # - 私服上 cloudwalk-common-web 等 POM 若传递依赖不完整,隔离构建会缺 spring-boot / commons-lang # 等编译包。可选(3)从全局 ~/.m2 复制 cloudwalk-common-* 同版本目录(与 Nexus 二选一:先复制则优先用本地该目录)。 # - Nexus 常缺 SNAPSHOT 父 POM(cwos / davinci)及 cloudwalk-device-sdk 父 POM:若相邻仓库存在对应 pom.xml,则自动 mvn -N install # 到隔离库:maven-cwos-resource 的 cwos-component-resource、cwos-portal;maven-cloudwalk-intelligent-davinci-manager 根 POM; # maven-cloudwalk-device-sdk 根 POM(供 intelligent-cwoscomponent-interface 解析 protocol-entity)。 # ELEVATOR_AUTO_INSTALL_LEGACY_SNAPSHOT_PARENTS=0 跳过上述「相邻父 POM install」整段。 # - intelligent-cwoscomponent 固定为 2.9.2-xinghewan(与 cw_lib 一致,禁止 3.0.0):可先 ELEVATOR_BOOTSTRAP_INTELLIGENT_CWOSCOMPONENT_FROM_GLOBAL # 从 ~/.m2 复制 parent(artifactId intelligent-cwoscomponent)/ interface / rest;若仍缺 JAR,则对 # cw-elevator-application-V1.0.0.20211103/cw_lib 内同名 jar+pom 执行 install-file,并先安装 scripts/legacy-poms 下父 POM 桩。 # ELEVATOR_AUTO_INSTALL_INTELLIGENT_CWOSCOMPONENT=0 跳过 install;ELEVATOR_CW_LIB_DIR 覆盖 cw_lib 路径。 # - cwos-sdk-event(默认 1.5.0-SNAPSHOT):ELEVATOR_BOOTSTRAP_CWOS_SDK_EVENT_FROM_GLOBAL 从 ~/.m2 复制;缺 JAR 时对 # maven-cloudwalk-legacy-public/cwos-sdk-event mvn install。ELEVATOR_AUTO_INSTALL_CWOS_SDK_EVENT=0 跳过 install。 # - ELEVATOR_BOOTSTRAP_FROM_GLOBAL_M2=0 跳过(1);ELEVATOR_AUTO_INSTALL_LEGACY_PARENT=0 跳过(2); # ELEVATOR_BOOTSTRAP_CLOUDWALK_MODULES_FROM_GLOBAL=0 跳过(3)(坚持纯 Nexus 时用)。 # # 用法: # ./scripts/build_nexus_only.sh # ELEVATOR_M2_REPO=/path/to/custom-repo ./scripts/build_nexus_only.sh # ELEVATOR_SYNC_DEPLOY=1 ./scripts/build_nexus_only.sh # 另同步 V1/V2 到 deploy/v1-legacy 与 deploy/v2-maven # - 编译成功后默认将 starter fat jar 安装到 deploy/v2-maven/(覆盖 cw-elevator-application-2.0.0.jar)。 # ELEVATOR_DEPLOY_V2_MAVEN=0 跳过;ELEVATOR_DEPLOY_V2_DIR=/path 覆盖目标目录(默认同 deploy/v2-maven)。 set -euo pipefail REPO="$(cd "$(dirname "$0")/.." && pwd)" cd "$REPO" if [[ -z "${JAVA_8:-}" ]]; then for d in /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-1.8.0-openjdk; do if [[ -x "$d/bin/java" ]]; then export JAVA_8="$d" break fi done fi : "${JAVA_8:=/usr/lib/jvm/java-8-openjdk-amd64}" export JAVA_HOME="$JAVA_8" export PATH="$JAVA_HOME/bin:$PATH" if [[ ! -x "${JAVA_HOME}/bin/java" ]]; then echo "ERROR: 未找到 JDK 8,请设置 JAVA_8 或安装 openjdk-8-jdk。" >&2 exit 1 fi M2_LOCAL="${ELEVATOR_M2_REPO:-$REPO/.m2-elevator-nexus-only}" mkdir -p "$M2_LOCAL" LEGACY_VER="${CLOUDWALK_LEGACY_VERSION:-3.7.2-Brussels-SRX}" ICOMP_VER="${ELEVATOR_INTELLIGENT_CWOSCOMPONENT_VERSION:-2.9.2-xinghewan}" CWOS_EVENT_VER="${ELEVATOR_CWOS_SDK_EVENT_VERSION:-1.5.0-SNAPSHOT}" GLOBAL_M2="${ELEVATOR_GLOBAL_M2:-$HOME/.m2/repository}" parent_marker_file() { echo "$M2_LOCAL/cn/cloudwalk/cloud/cloudwalk-cloud-common/${LEGACY_VER}/cloudwalk-cloud-common-${LEGACY_VER}.pom" } bootstrap_from_global_m2() { local rel="cn/cloudwalk/cloud/cloudwalk-cloud-common/${LEGACY_VER}" local src="$GLOBAL_M2/$rel" if [[ ! -d "$src" ]]; then echo "WARN: 全局仓库中无父 POM 目录: $src(将尝试相邻 legacy 自动 install)" >&2 return 0 fi mkdir -p "$M2_LOCAL/$rel" cp -a "$src/." "$M2_LOCAL/$rel/" echo "==> 已从全局 ~/.m2 预置父 POM(仅该目录): $rel" } purge_last_updated_under() { local base="$1" [[ -d "$base" ]] || return 0 find "$base" -name '*.lastUpdated' -type f -print -delete 2>/dev/null || true } # 参数: marker_pom_path pom_file human_desc install_one_snapshot_parent_to_local_repo() { local marker="$1" local pom="$2" local desc="$3" if [[ -f "$marker" ]]; then echo "==> 隔离库已有: $desc" return 0 fi if [[ ! -f "$pom" ]]; then echo "ERROR: 隔离库缺少 $desc,且未找到 POM: $pom" >&2 echo " 请将对应父 POM 发布到 Nexus,或设置 ELEVATOR_LEGACY_CWOS_RESOURCE_DIR / ELEVATOR_LEGACY_DAVINCI_MANAGER_POM。" >&2 exit 1 fi echo "==> 向隔离库安装(mvn -N install): $desc -> $pom" mvn -Dmaven.repo.local="$M2_LOCAL" -f "$pom" -N install -DskipTests if [[ ! -f "$marker" ]]; then echo "ERROR: install 后仍缺少: $marker" >&2 exit 1 fi } install_legacy_cloudwalk_parent_to_local_repo() { local marker marker="$(parent_marker_file)" if [[ -f "$marker" ]]; then echo "==> 隔离库已有父 POM: $marker" return 0 fi if [[ "${ELEVATOR_AUTO_INSTALL_LEGACY_PARENT:-1}" != "1" ]]; then echo "ERROR: 隔离库缺少父 POM 且 ELEVATOR_AUTO_INSTALL_LEGACY_PARENT=0:$marker" >&2 exit 1 fi local def_pom def_pom="$(cd "$REPO/.." && pwd)/maven-cloudwalk-legacy-public/cloudwalk-cloud-common/pom.xml" local legacy_pom="${ELEVATOR_LEGACY_CLOUDWALK_COMMON_POM:-$def_pom}" if [[ ! -f "$legacy_pom" ]]; then echo "ERROR: 隔离库无 cloudwalk-cloud-common POM,且未找到:$legacy_pom" >&2 echo " 请设置 ELEVATOR_LEGACY_CLOUDWALK_COMMON_POM,或将该父 POM 发布到 Nexus。" >&2 exit 1 fi echo "==> 向隔离库安装父 POM(mvn -N install): $legacy_pom" mvn -Dmaven.repo.local="$M2_LOCAL" -f "$legacy_pom" -N install -DskipTests if [[ ! -f "$marker" ]]; then echo "ERROR: install 后仍缺少: $marker" >&2 exit 1 fi } if [[ "${ELEVATOR_BOOTSTRAP_FROM_GLOBAL_M2:-1}" == "1" ]]; then echo "==> 尝试从全局 ~/.m2 预置 cloudwalk-cloud-common(${LEGACY_VER})" bootstrap_from_global_m2 fi install_legacy_cloudwalk_parent_to_local_repo # 私服缺 cwos-portal / cwos-component-resource / cloudwalk-intelligent-davinci-manager 等父 POM 时,用相邻反应堆根 POM 闭合描述符。 install_legacy_snapshot_parents_to_local_repo() { if [[ "${ELEVATOR_AUTO_INSTALL_LEGACY_SNAPSHOT_PARENTS:-1}" != "1" ]]; then return 0 fi local root root="$(cd "$REPO/.." && pwd)" local def_cwos="$root/maven-cwos-resource" local def_davinci="$root/maven-cloudwalk-intelligent-davinci-manager/pom.xml" local cwos_base="${ELEVATOR_LEGACY_CWOS_RESOURCE_DIR:-$def_cwos}" install_one_snapshot_parent_to_local_repo \ "$M2_LOCAL/cn/cloudwalk/cloud/cwos-component-resource/1.0.0-SNAPSHOT/cwos-component-resource-1.0.0-SNAPSHOT.pom" \ "$cwos_base/cwos-component-resource/pom.xml" \ "cwos-component-resource 1.0.0-SNAPSHOT" install_one_snapshot_parent_to_local_repo \ "$M2_LOCAL/cn/cloudwalk/cwos-portal/1.0.0-SNAPSHOT/cwos-portal-1.0.0-SNAPSHOT.pom" \ "$cwos_base/cwos-portal/pom.xml" \ "cwos-portal 1.0.0-SNAPSHOT" install_one_snapshot_parent_to_local_repo \ "$M2_LOCAL/cn/cloudwalk/intelligent/cloudwalk-intelligent-davinci-manager/1.1.7-SNAPSHOT/cloudwalk-intelligent-davinci-manager-1.1.7-SNAPSHOT.pom" \ "${ELEVATOR_LEGACY_DAVINCI_MANAGER_POM:-$def_davinci}" \ "cloudwalk-intelligent-davinci-manager 1.1.7-SNAPSHOT" install_one_snapshot_parent_to_local_repo \ "$M2_LOCAL/cn/cloudwalk/cloudwalk-device-sdk/2.2.0/cloudwalk-device-sdk-2.2.0.pom" \ "${ELEVATOR_LEGACY_DEVICE_SDK_POM:-$root/maven-cloudwalk-device-sdk/pom.xml}" \ "cloudwalk-device-sdk 2.2.0" } install_legacy_snapshot_parents_to_local_repo bootstrap_intelligent_cwoscomponent_from_global() { if [[ "${ELEVATOR_BOOTSTRAP_INTELLIGENT_CWOSCOMPONENT_FROM_GLOBAL:-1}" != "1" ]]; then return 0 fi local copied=0 # 2.9.2 线:父 artifactId 为 intelligent-cwoscomponent(非 reactor/parent 3.x 命名) for art in intelligent-cwoscomponent intelligent-cwoscomponent-interface intelligent-cwoscomponent-rest; do local rel="cn/cloudwalk/intelligent/${art}/${ICOMP_VER}" if [[ -d "$GLOBAL_M2/$rel" ]]; then mkdir -p "$M2_LOCAL/$rel" cp -a "$GLOBAL_M2/$rel/." "$M2_LOCAL/$rel/" echo "==> 已从 ~/.m2 预置 intelligent-cwoscomponent: $rel" copied=1 fi done if [[ "$copied" -eq 0 ]]; then echo "WARN: ~/.m2 中未找到 intelligent-cwoscomponent-*(${ICOMP_VER}),将视情况从 cw_lib install-file。" >&2 fi } install_intelligent_cwoscomponent_from_cw_lib_if_missing() { if [[ "${ELEVATOR_AUTO_INSTALL_INTELLIGENT_CWOSCOMPONENT:-1}" != "1" ]]; then return 0 fi if [[ "$ICOMP_VER" == "3.0.0-xinghewan" ]]; then echo "ERROR: 本产品线禁止使用 intelligent-cwoscomponent 3.0.0-xinghewan;请使用 2.9.2-xinghewan(cw_lib)。" >&2 exit 1 fi local marker="$M2_LOCAL/cn/cloudwalk/intelligent/intelligent-cwoscomponent-rest/${ICOMP_VER}/intelligent-cwoscomponent-rest-${ICOMP_VER}.jar" if [[ -f "$marker" ]]; then echo "==> 隔离库已有 intelligent-cwoscomponent-rest(${ICOMP_VER})" return 0 fi local root cw_lib root="$(cd "$REPO/.." && pwd)" cw_lib="${ELEVATOR_CW_LIB_DIR:-$root/cw-elevator-application-V1.0.0.20211103/cw_lib}" local stub="$REPO/scripts/legacy-poms/intelligent-cwoscomponent-2.9.2-xinghewan-parent.pom" local ij="$cw_lib/intelligent-cwoscomponent-interface-${ICOMP_VER}.jar" local ip="$cw_lib/intelligent-cwoscomponent-interface-${ICOMP_VER}.pom" local rj="$cw_lib/intelligent-cwoscomponent-rest-${ICOMP_VER}.jar" local rp="$cw_lib/intelligent-cwoscomponent-rest-${ICOMP_VER}.pom" if [[ ! -f "$stub" ]]; then echo "ERROR: 缺少父 POM 桩: $stub" >&2 exit 1 fi if [[ ! -f "$ij" || ! -f "$ip" || ! -f "$rj" || ! -f "$rp" ]]; then echo "ERROR: cw_lib 缺少 intelligent-cwoscomponent 2.9.2 构件,无法安装到隔离库。" >&2 echo " 期望目录: $cw_lib(设 ELEVATOR_CW_LIB_DIR 可覆盖)" >&2 echo " 需要: intelligent-cwoscomponent-interface/rest 的 .jar 与 .pom" >&2 exit 1 fi echo "==> 向隔离库安装 intelligent-cwoscomponent 父 POM(桩): $stub" mvn -Dmaven.repo.local="$M2_LOCAL" -f "$stub" -N install -DskipTests echo "==> install-file intelligent-cwoscomponent-interface(${ICOMP_VER})" mvn -Dmaven.repo.local="$M2_LOCAL" org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file \ -DpomFile="$ip" -Dfile="$ij" -Dpackaging=jar echo "==> install-file intelligent-cwoscomponent-rest(${ICOMP_VER})" mvn -Dmaven.repo.local="$M2_LOCAL" org.apache.maven.plugins:maven-install-plugin:3.1.1:install-file \ -DpomFile="$rp" -Dfile="$rj" -Dpackaging=jar if [[ ! -f "$marker" ]]; then echo "ERROR: install 后仍缺少: $marker" >&2 exit 1 fi } bootstrap_intelligent_cwoscomponent_from_global install_intelligent_cwoscomponent_from_cw_lib_if_missing bootstrap_cwos_sdk_event_from_global() { if [[ "${ELEVATOR_BOOTSTRAP_CWOS_SDK_EVENT_FROM_GLOBAL:-1}" != "1" ]]; then return 0 fi local rel="cn/cloudwalk/cloud/cwos-sdk-event/${CWOS_EVENT_VER}" if [[ -d "$GLOBAL_M2/$rel" ]]; then mkdir -p "$M2_LOCAL/$rel" cp -a "$GLOBAL_M2/$rel/." "$M2_LOCAL/$rel/" echo "==> 已从 ~/.m2 预置 cwos-sdk-event: $rel" else echo "WARN: ~/.m2 中无 cwos-sdk-event(${CWOS_EVENT_VER}),将视情况 mvn install legacy 模块。" >&2 fi } install_cwos_sdk_event_if_missing() { if [[ "${ELEVATOR_AUTO_INSTALL_CWOS_SDK_EVENT:-1}" != "1" ]]; then return 0 fi local marker="$M2_LOCAL/cn/cloudwalk/cloud/cwos-sdk-event/${CWOS_EVENT_VER}/cwos-sdk-event-${CWOS_EVENT_VER}.jar" if [[ -f "$marker" ]]; then echo "==> 隔离库已有 cwos-sdk-event(${CWOS_EVENT_VER})" return 0 fi local root def_pom root="$(cd "$REPO/.." && pwd)" def_pom="$root/maven-cloudwalk-legacy-public/cwos-sdk-event/pom.xml" local ev_pom="${ELEVATOR_LEGACY_CWOS_SDK_EVENT_POM:-$def_pom}" if [[ ! -f "$ev_pom" ]]; then echo "ERROR: 私服缺少 cwos-sdk-event:${CWOS_EVENT_VER},且未找到: $ev_pom" >&2 exit 1 fi echo "==> 向隔离库 install cwos-sdk-event: $ev_pom" mvn -Dmaven.repo.local="$M2_LOCAL" -f "$ev_pom" install -DskipTests if [[ ! -f "$marker" ]]; then echo "ERROR: install 后仍缺少: $marker" >&2 exit 1 fi } bootstrap_cwos_sdk_event_from_global install_cwos_sdk_event_if_missing bootstrap_cloudwalk_modules_from_global() { if [[ "${ELEVATOR_BOOTSTRAP_CLOUDWALK_MODULES_FROM_GLOBAL:-1}" != "1" ]]; then return 0 fi local _arts="${ELEVATOR_CLOUDWALK_BOOTSTRAP_ARTIFACTS:-cloudwalk-common-result cloudwalk-common-web cloudwalk-common-serial cloudwalk-common-service}" local copied=0 for a in $_arts; do [[ -n "$a" ]] || continue local rel="cn/cloudwalk/cloud/${a}/${LEGACY_VER}" if [[ -d "$GLOBAL_M2/$rel" ]]; then mkdir -p "$M2_LOCAL/$rel" cp -a "$GLOBAL_M2/$rel/." "$M2_LOCAL/$rel/" echo "==> 已从 ~/.m2 预置 cloudwalk 构件目录: $rel" copied=1 fi done if [[ "$copied" -eq 0 ]]; then echo "WARN: ~/.m2 中未找到上述 cloudwalk-common-* 目录(${LEGACY_VER}),将完全依赖 Nexus 传递依赖。" >&2 fi } bootstrap_cloudwalk_modules_from_global echo "==> 清理 cn/cloudwalk 下失败缓存 (*.lastUpdated)" purge_last_updated_under "$M2_LOCAL/cn/cloudwalk" MVN_GOALS="${ELEVATOR_MVN_GOALS:-clean package}" echo "==> 使用隔离本地仓库: $M2_LOCAL" echo "==> mvn -Dmaven.repo.local=... $MVN_GOALS -DskipTests -U" mvn -Dmaven.repo.local="$M2_LOCAL" -U $MVN_GOALS -DskipTests JAR="$REPO/cw-elevator-application-starter/target/cw-elevator-application-2.0.0.jar" echo "==> 产物: $JAR" test -f "$JAR" && ls -la "$JAR" if [[ -f "$JAR" && "${ELEVATOR_DEPLOY_V2_MAVEN:-1}" == "1" ]]; then V2_DEPLOY_DIR="${ELEVATOR_DEPLOY_V2_DIR:-$REPO/deploy/v2-maven}" mkdir -p "$V2_DEPLOY_DIR" install -m0644 "$JAR" "$V2_DEPLOY_DIR/cw-elevator-application-2.0.0.jar" echo "==> 已发布到 deploy/v2-maven(替换 JAR): $V2_DEPLOY_DIR/cw-elevator-application-2.0.0.jar" ls -la "$V2_DEPLOY_DIR/cw-elevator-application-2.0.0.jar" fi if [[ "${ELEVATOR_SYNC_DEPLOY:-0}" == "1" ]]; then SYNC="$REPO/deploy/sync-jars.sh" if [[ -x "$SYNC" ]] || chmod +x "$SYNC" 2>/dev/null; then echo "==> ELEVATOR_SYNC_DEPLOY=1 -> $SYNC" bash "$SYNC" else echo "WARN: 未找到可执行的 deploy/sync-jars.sh,跳过同步。" >&2 fi fi