Class: Pindo::JavaEnvHelper
- Inherits:
-
Object
- Object
- Pindo::JavaEnvHelper
- Defined in:
- lib/pindo/module/android/java_env_helper.rb
Class Method Summary collapse
-
.build_jdk_path_from_unity_root(unity_path) ⇒ Object
根据 Unity 根路径构建 JDK 路径.
-
.ensure_java_version_compliance ⇒ Object
检查并确保 Java 版本符合要求 (Java 11+).
-
.find_java_17 ⇒ Object
查找系统中的 Java 17.
-
.find_java_command ⇒ Object
查找 Java 命令.
-
.find_unity_editor_paths ⇒ Object
查找 Unity Editor 安装路径.
-
.install_java_11 ⇒ Object
自动安装 Java 11.
-
.install_java_11_macos ⇒ Object
在 macOS 上安装 Java 11.
-
.setup_java_home_from_project(project_dir, use_main: false) ⇒ String?
从 gradle.properties 文件中读取并设置 Java Home 环境变量.
-
.verify_java_version(java_path) ⇒ Object
验证 Java 版本是否满足要求 (Java 11+).
Instance Method Summary collapse
-
#check_and_replace_unity_jdk(jdk_path) ⇒ Object
检查并替换 Unity Editor 中的 JDK.
-
#check_and_update_unity_jdk ⇒ Object
检查并更新 Unity Editor 中的 JDK 版本.
-
#create_and_install_openjdk(jdk_path) ⇒ Object
创建 OpenJDK 目录并安装 Java 11.
-
#find_java11_installation ⇒ Object
查找系统中的 Java 11 安装.
-
#install_adoptium_java_11 ⇒ Object
下载并安装 Adoptium OpenJDK 11.
-
#replace_unity_jdk_with_java11(jdk_path) ⇒ Object
替换 Unity Editor 中的 JDK 为 Java 11.
Class Method Details
.build_jdk_path_from_unity_root(unity_path) ⇒ Object
根据 Unity 根路径构建 JDK 路径
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 285 def build_jdk_path_from_unity_root(unity_path) # 1. 全局 Unity 路径 if unity_path == "/Applications/Unity" return "/Applications/Unity/PlaybackEngines/AndroidPlayer/OpenJDK" end # 2. Unity Hub 路径(包含版本号) if unity_path.include?("/Unity/Hub/Editor/") # 检查是否有 PlaybackEngines 目录 playback_engines_path = File.join(unity_path, "PlaybackEngines") if File.directory?(playback_engines_path) return File.join(playback_engines_path, "AndroidPlayer", "OpenJDK") end end # 3. 其他 Unity 版本路径 if unity_path.include?("/Unity/") && !unity_path.include?("/Hub/") # 检查是否有 PlaybackEngines 目录 playback_engines_path = File.join(unity_path, "PlaybackEngines") if File.directory?(playback_engines_path) return File.join(playback_engines_path, "AndroidPlayer", "OpenJDK") end end # 4. 默认尝试 File.join(unity_path, "PlaybackEngines", "AndroidPlayer", "OpenJDK") end |
.ensure_java_version_compliance ⇒ Object
检查并确保 Java 版本符合要求 (Java 11+)
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 209 def ensure_java_version_compliance # 仅检测Unity Editor JDK版本,不进行替换 unity_root_paths = find_unity_editor_paths if unity_root_paths.any? unity_root_paths.each do |unity_root| # 构建JDK路径 jdk_path = build_jdk_path_from_unity_root(unity_root) if File.exist?(jdk_path) java_cmd = File.join(jdk_path, "bin", "java") if File.exist?(java_cmd) version_output = `"#{java_cmd}" -version 2>&1` if version_output =~ /version "(\d+)/ major_version = $1.to_i unless major_version >= 11 Funlog.warning("Unity Editor JDK 版本 #{major_version} 不符合要求 (需要 Java 11+)") end end end end end end # 查找当前可用的 Java 命令 current_java = find_java_command # 验证当前 Java 版本 if verify_java_version(current_java) version_output = `"#{current_java}" -version 2>&1` if version_output =~ /version "(\d+)/ major_version = $1.to_i return true end end Funlog.error("当前 Java 版本不符合要求,需要 Java 11+") Funlog.info("请手动安装 Java 11: brew install openjdk@11") return false end |
.find_java_17 ⇒ Object
查找系统中的 Java 17
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 91 def find_java_17 # 1. 检查 Android Studio 内置的 JDK android_studio_paths = [ "/Applications/Android Studio.app/Contents/jbr/Contents/Home", "/Applications/Android Studio Preview.app/Contents/jbr/Contents/Home", File.("~/Applications/Android Studio.app/Contents/jbr/Contents/Home") ] android_studio_paths.each do |path| if File.directory?(path) java_bin = File.join(path, "bin", "java") if File.exist?(java_bin) # 验证版本 version_output = `"#{java_bin}" -version 2>&1` # Android Studio 的 JBR 通常是 Java 17+ if version_output =~ /version "(\d+)/ version = $1.to_i if version >= 17 puts " ✓ 使用 Android Studio 内置 JDK: Java #{version}" return path end end end end end # 2. 尝试使用 /usr/libexec/java_home(macOS) if File.exist?('/usr/libexec/java_home') java17_home = `/usr/libexec/java_home -v 17 2>/dev/null`.strip if !java17_home.empty? && File.directory?(java17_home) return java17_home end end # 3. 检查常见的 Java 17 安装路径 java17_paths = [ # Homebrew 安装路径 "/opt/homebrew/opt/openjdk@17", "/usr/local/opt/openjdk@17", # 系统安装路径 "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", "/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home", "/Library/Java/JavaVirtualMachines/adoptopenjdk-17.jdk/Contents/Home", "/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home", ] java17_paths.each do |path| if File.directory?(path) java_bin = File.join(path, "bin", "java") if File.exist?(java_bin) # 验证版本 version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "17/ || version_output =~ /version "(\d+)/ && $1.to_i == 17 return path end end end end nil end |
.find_java_command ⇒ Object
查找 Java 命令
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 154 def find_java_command # 检查 JAVA_HOME 环境变量 if ENV['JAVA_HOME'] && File.exist?(File.join(ENV['JAVA_HOME'], 'bin', 'java')) java_path = File.join(ENV['JAVA_HOME'], 'bin', 'java') # 验证 Java 版本 if verify_java_version(java_path) return java_path end end # 尝试常见的 Java 路径 common_java_paths = [ '/usr/libexec/java_home', # macOS '/usr/bin/java', '/usr/local/bin/java', '/opt/homebrew/bin/java', # macOS Homebrew '/usr/local/opt/openjdk/bin/java' # macOS Homebrew OpenJDK ] common_java_paths.each do |java_path| if File.exist?(java_path) # 对于 macOS 的 java_home,需要特殊处理 if java_path.include?('java_home') java_home_output = `#{java_path} 2>/dev/null`.strip if !java_home_output.empty? actual_java_path = File.join(java_home_output, 'bin', 'java') if File.exist?(actual_java_path) && verify_java_version(actual_java_path) return actual_java_path end end elsif verify_java_version(java_path) return java_path end end end # 如果都找不到,返回默认的 java 命令 'java' end |
.find_unity_editor_paths ⇒ Object
查找 Unity Editor 安装路径
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 251 def find_unity_editor_paths unity_paths = [] # 1. 检查全局 Unity PlaybackEngines 路径(最常见) global_playback_engines = "/Applications/Unity/PlaybackEngines" if File.directory?(global_playback_engines) unity_paths << "/Applications/Unity" end # 2. 检查 Unity Hub 中的多个版本(支持 2021.3.* 版本范围) unity_hub_patterns = [ "/Applications/Unity/Hub/Editor/2021.3.*/PlaybackEngines" ] unity_hub_patterns.each do |pattern| Dir.glob(pattern).each do |playback_engines_path| # Unity Hub 版本:/Applications/Unity/Hub/Editor/2022.3.15f1/PlaybackEngines unity_root = playback_engines_path.gsub("/PlaybackEngines", "") unity_paths << unity_root end end # 3. 检查其他常见的 Unity 安装路径 other_pattern = "/Applications/Unity/*/PlaybackEngines" Dir.glob(other_pattern).each do |playback_engines_path| # 其他 Unity 版本:/Applications/Unity/2022.3.15f1/PlaybackEngines unity_root = playback_engines_path.gsub("/PlaybackEngines", "") unity_paths << unity_root end unity_paths.uniq end |
.install_java_11 ⇒ Object
自动安装 Java 11
314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 314 def install_java_11 begin # 检查是否在 macOS 上 if RbConfig::CONFIG['host_os'] =~ /darwin/ return install_java_11_macos else Funlog.warning("当前系统不是 macOS,请手动安装 Java 11") return false end rescue => e Funlog.error("安装 Java 11 时出错: #{e.message}") return false end end |
.install_java_11_macos ⇒ Object
在 macOS 上安装 Java 11
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 330 def install_java_11_macos Funlog.("在 macOS 上安装 Java 11") # 方法1: 使用 Homebrew 安装 if system("which brew > /dev/null 2>&1") if system("brew install openjdk@11") # 设置 JAVA_HOME java_home_path = `brew --prefix openjdk@11`.strip if !java_home_path.empty? && File.directory?(java_home_path) java_bin_path = File.join(java_home_path, "bin", "java") if File.exist?(java_bin_path) # 设置环境变量 ENV['JAVA_HOME'] = java_home_path Funlog.("Java 11 安装成功") return true end end end # 方法2: 使用 SDKMAN 安装 if system("which sdk > /dev/null 2>&1") if system("sdk install java 11.0.21-tem") # 设置环境变量 sdkman_home = ENV['SDKMAN_DIR'] || File.("~/.sdkman") java_home_path = File.join(sdkman_home, "candidates", "java", "11.0.21-tem") if File.directory?(java_home_path) ENV['JAVA_HOME'] = java_home_path Funlog.("Java 11 安装成功") return true end end end # 方法3: 下载并安装 Adoptium OpenJDK Funlog.("下载 Adoptium OpenJDK 11...") return install_adoptium_java_11 end # 下载并安装 Adoptium OpenJDK 11 def install_adoptium_java_11 begin # 创建临时目录 temp_dir = Dir.mktmpdir("java_install_") # 下载 URL (macOS x64) download_url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_mac_hotspot_11.0.21_9.tar.gz" tar_file = File.join(temp_dir, "openjdk11.tar.gz") if system("curl -L -o \"#{tar_file}\" \"#{download_url}\"") if system("tar -xzf \"#{tar_file}\" -C \"#{temp_dir}\"") # 查找解压后的目录 jdk_dir = Dir.glob(File.join(temp_dir, "jdk-11*")).first if jdk_dir && File.directory?(jdk_dir) # 尝试安装到用户目录而不是系统目录 user_install_dir = File.("~/.pindo/java11") if system("mkdir -p \"#{File.dirname(user_install_dir)}\" && mv \"#{jdk_dir}\" \"#{user_install_dir}\"") # 设置环境变量 ENV['JAVA_HOME'] = user_install_dir return true else # 回退到系统目录 install_dir = "/usr/local/openjdk11" if system("sudo mkdir -p /usr/local && sudo mv \"#{jdk_dir}\" \"#{install_dir}\"") # 设置环境变量 ENV['JAVA_HOME'] = install_dir return true end end end end end return false rescue => e return false ensure # 清理临时目录 FileUtils.rm_rf(temp_dir) if temp_dir && File.directory?(temp_dir) end end # 检查并更新 Unity Editor 中的 JDK 版本 def check_and_update_unity_jdk return false unless RbConfig::CONFIG['host_os'] =~ /darwin/ # 查找 Unity Editor 安装路径 unity_paths = find_unity_editor_paths if unity_paths.empty? return false end updated_any = false unity_paths.each do |unity_path| # 根据不同的 Unity 路径结构构建 JDK 路径 jdk_path = build_jdk_path_from_unity_root(unity_path) if File.directory?(jdk_path) if check_and_replace_unity_jdk(jdk_path) updated_any = true end else # OpenJDK 目录不存在,尝试创建并安装 Java 11 if create_and_install_openjdk(jdk_path) updated_any = true end end end updated_any end # 创建 OpenJDK 目录并安装 Java 11 def create_and_install_openjdk(jdk_path) begin # 创建 OpenJDK 目录(使用 sudo 权限) unless system("sudo mkdir -p \"#{jdk_path}\"") return false end # 查找或安装 Java 11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) # 自动下载并安装 Java 11 if install_java_11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) return false end else return false end end # 复制 Java 11 到 OpenJDK 目录(使用 sudo 权限) if system("sudo cp -R \"#{java11_path}\"/* \"#{jdk_path}\"/") # 验证安装 java_bin = File.join(jdk_path, "bin", "java") if File.exist?(java_bin) version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ version = $1.to_i return version >= 11 end end return true else return false end rescue => e return false end end # 检查并替换 Unity Editor 中的 JDK def check_and_replace_unity_jdk(jdk_path) begin # 检查当前 JDK 版本 java_bin = File.join(jdk_path, "bin", "java") if File.exist?(java_bin) version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ current_version = $1.to_i puts "Unity Editor JDK 当前版本: #{current_version}" if current_version >= 11 puts "\e[32m✓ Unity Editor JDK 版本 #{current_version} 符合要求\e[0m" return false else puts "\e[31m✗ Unity Editor JDK 版本 #{current_version} 不符合要求,需要 Java 11+\e[0m" return replace_unity_jdk_with_java11(jdk_path) end end else puts "\e[31m✗ Unity Editor JDK 中未找到 java 可执行文件\e[0m" return replace_unity_jdk_with_java11(jdk_path) end return false rescue => e puts "\e[31m检查 Unity Editor JDK 时出错: #{e.message}\e[0m" return false end end # 替换 Unity Editor 中的 JDK 为 Java 11 def replace_unity_jdk_with_java11(jdk_path) begin puts "\e[33m正在替换 Unity Editor JDK 为 Java 11...\e[0m" # 查找系统中的 Java 11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) puts "\e[33m未找到系统中的 Java 11 安装,正在自动下载...\e[0m" # 自动下载并安装 Java 11 if install_java_11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) puts "\e[31m✗ Java 11 自动安装失败\e[0m" return false end puts "\e[32m✓ Java 11 自动安装成功\e[0m" else puts "\e[31m✗ Java 11 自动安装失败\e[0m" return false end end puts "找到 Java 11 安装路径: #{java11_path}" # 备份原始 JDK(使用 sudo 权限) backup_path = "#{jdk_path}_backup_#{Time.now.strftime('%Y%m%d_%H%M%S')}" puts "备份原始 JDK 到: #{backup_path}" puts "\e[33m需要管理员权限来备份和替换 Unity Editor JDK,请输入密码...\e[0m" if system("sudo cp -R \"#{jdk_path}\" \"#{backup_path}\"") puts "\e[32m✓ 原始 JDK 备份成功\e[0m" else puts "\e[31m✗ 原始 JDK 备份失败\e[0m" return false end # 删除原始 JDK 内容(使用 sudo 权限) puts "删除原始 JDK 内容..." if system("sudo rm -rf \"#{jdk_path}/*\"") puts "\e[32m✓ 原始 JDK 内容删除成功\e[0m" else puts "\e[31m✗ 原始 JDK 内容删除失败\e[0m" return false end # 复制 Java 11 到 Unity JDK 目录(使用 sudo 权限) puts "复制 Java 11 到 Unity JDK 目录..." if system("sudo cp -R \"#{java11_path}\"/* \"#{jdk_path}/\"") puts "\e[32m✓ Java 11 复制成功\e[0m" # 验证替换结果 new_java_bin = File.join(jdk_path, "bin", "java") if File.exist?(new_java_bin) version_output = `"#{new_java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ new_version = $1.to_i if new_version >= 11 puts "\e[32m✓ Unity Editor JDK 已成功替换为 Java #{new_version}\e[0m" return true else puts "\e[31m✗ 替换后的 JDK 版本仍然不符合要求: #{new_version}\e[0m" end end end else puts "\e[31m✗ Java 11 复制失败\e[0m" return false end return false rescue => e puts "\e[31m替换 Unity Editor JDK 时出错: #{e.message}\e[0m" return false end end # 查找系统中的 Java 11 安装 def find_java11_installation # 检查常见的 Java 11 安装路径 java11_paths = [ # Homebrew 安装路径 "/opt/homebrew/opt/openjdk@11", "/usr/local/opt/openjdk@11", # SDKMAN 安装路径 File.("~/.sdkman/candidates/java/11.0.21-tem"), File.("~/.sdkman/candidates/java/11.0.20-tem"), # 系统安装路径 "/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home", "/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home", # Pindo 安装的 Java 11 File.("~/.pindo/java11") ] java11_paths.each do |path| if File.directory?(path) java_bin = File.join(path, "bin", "java") if File.exist?(java_bin) # 验证版本 version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ version = $1.to_i if version >= 11 return path end end end end end nil end end |
.setup_java_home_from_project(project_dir, use_main: false) ⇒ String?
从 gradle.properties 文件中读取并设置 Java Home 环境变量
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 13 def setup_java_home_from_project(project_dir, use_main: false) gradle_properties_path = File.join(project_dir, "gradle.properties") if Pindo::AndroidProjectHelper.unity_android_project?(project_dir) gradle_properties_path = File.join(project_dir, "gradle.properties") # 2. 处理 Unity 作为 lib 的原生工程(Unity 放在 Unity 目录下) elsif Pindo::AndroidProjectHelper.unity_as_lib_android_project?(project_dir) if use_main # 编译主工程 APK 时,使用主工程的 gradle.properties gradle_properties_path = File.join(project_dir, "gradle.properties") puts "使用主工程的Java配置: #{gradle_properties_path}" else # 编译 Unity SO 库时,使用 Unity 的 gradle.properties gradle_properties_path = File.join(project_dir, "Unity", "gradle.properties") puts "使用Unity模块的Java配置: #{gradle_properties_path}" end end return nil unless File.exist?(gradle_properties_path) content = File.read(gradle_properties_path) java_home_match = content.match(/org\.gradle\.java\.home\s*=\s*(.+)/) if java_home_match && !java_home_match[1].empty? java_home_path = java_home_match[1].strip # 处理路径:将相对路径转换为绝对路径 if java_home_path.start_with?('/') # 已经是绝对路径 absolute_java_home = java_home_path elsif java_home_path.start_with?('~') # 处理 ~ 开头的路径 absolute_java_home = File.(java_home_path) else # 相对路径,相对于 gradle.properties 文件所在目录 gradle_dir = File.dirname(gradle_properties_path) absolute_java_home = File.(File.join(gradle_dir, java_home_path)) end # 验证路径是否存在 unless File.directory?(absolute_java_home) return nil end # 验证是否包含有效的 Java 安装 java_executable = File.join(absolute_java_home, "bin", "java") unless File.exist?(java_executable) return nil end # 设置环境变量 ENV['JAVA_HOME'] = absolute_java_home ENV['PATH'] = "#{absolute_java_home}/bin:#{ENV['PATH']}" puts " ✓ Java Home 已设置: #{absolute_java_home}" return absolute_java_home end # 如果 gradle.properties 中没有配置 Java Home,尝试自动查找 if use_main puts " ⚠ gradle.properties 中未配置 org.gradle.java.home" puts " ✓ 尝试查找系统 Java 17..." java17_path = find_java_17 if java17_path ENV['JAVA_HOME'] = java17_path ENV['PATH'] = "#{java17_path}/bin:#{ENV['PATH']}" puts " ✓ 找到 Java 17: #{java17_path}" return java17_path else puts " ✗ 未找到 Java 17,请安装 Java 17 或在 gradle.properties 中配置 org.gradle.java.home" end end nil end |
.verify_java_version(java_path) ⇒ Object
验证 Java 版本是否满足要求 (Java 11+)
195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 195 def verify_java_version(java_path) begin version_output = `"#{java_path}" -version 2>&1` if version_output =~ /version "(\d+)/ major_version = $1.to_i return major_version >= 11 end rescue # 如果执行失败,返回 false end false end |
Instance Method Details
#check_and_replace_unity_jdk(jdk_path) ⇒ Object
检查并替换 Unity Editor 中的 JDK
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 487 def check_and_replace_unity_jdk(jdk_path) begin # 检查当前 JDK 版本 java_bin = File.join(jdk_path, "bin", "java") if File.exist?(java_bin) version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ current_version = $1.to_i puts "Unity Editor JDK 当前版本: #{current_version}" if current_version >= 11 puts "\e[32m✓ Unity Editor JDK 版本 #{current_version} 符合要求\e[0m" return false else puts "\e[31m✗ Unity Editor JDK 版本 #{current_version} 不符合要求,需要 Java 11+\e[0m" return replace_unity_jdk_with_java11(jdk_path) end end else puts "\e[31m✗ Unity Editor JDK 中未找到 java 可执行文件\e[0m" return replace_unity_jdk_with_java11(jdk_path) end return false rescue => e puts "\e[31m检查 Unity Editor JDK 时出错: #{e.message}\e[0m" return false end end |
#check_and_update_unity_jdk ⇒ Object
检查并更新 Unity Editor 中的 JDK 版本
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 412 def check_and_update_unity_jdk return false unless RbConfig::CONFIG['host_os'] =~ /darwin/ # 查找 Unity Editor 安装路径 unity_paths = find_unity_editor_paths if unity_paths.empty? return false end updated_any = false unity_paths.each do |unity_path| # 根据不同的 Unity 路径结构构建 JDK 路径 jdk_path = build_jdk_path_from_unity_root(unity_path) if File.directory?(jdk_path) if check_and_replace_unity_jdk(jdk_path) updated_any = true end else # OpenJDK 目录不存在,尝试创建并安装 Java 11 if create_and_install_openjdk(jdk_path) updated_any = true end end end updated_any end |
#create_and_install_openjdk(jdk_path) ⇒ Object
创建 OpenJDK 目录并安装 Java 11
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 442 def create_and_install_openjdk(jdk_path) begin # 创建 OpenJDK 目录(使用 sudo 权限) unless system("sudo mkdir -p \"#{jdk_path}\"") return false end # 查找或安装 Java 11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) # 自动下载并安装 Java 11 if install_java_11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) return false end else return false end end # 复制 Java 11 到 OpenJDK 目录(使用 sudo 权限) if system("sudo cp -R \"#{java11_path}\"/* \"#{jdk_path}\"/") # 验证安装 java_bin = File.join(jdk_path, "bin", "java") if File.exist?(java_bin) version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ version = $1.to_i return version >= 11 end end return true else return false end rescue => e return false end end |
#find_java11_installation ⇒ Object
查找系统中的 Java 11 安装
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 596 def find_java11_installation # 检查常见的 Java 11 安装路径 java11_paths = [ # Homebrew 安装路径 "/opt/homebrew/opt/openjdk@11", "/usr/local/opt/openjdk@11", # SDKMAN 安装路径 File.("~/.sdkman/candidates/java/11.0.21-tem"), File.("~/.sdkman/candidates/java/11.0.20-tem"), # 系统安装路径 "/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home", "/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home", # Pindo 安装的 Java 11 File.("~/.pindo/java11") ] java11_paths.each do |path| if File.directory?(path) java_bin = File.join(path, "bin", "java") if File.exist?(java_bin) # 验证版本 version_output = `"#{java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ version = $1.to_i if version >= 11 return path end end end end end nil end |
#install_adoptium_java_11 ⇒ Object
下载并安装 Adoptium OpenJDK 11
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 369 def install_adoptium_java_11 begin # 创建临时目录 temp_dir = Dir.mktmpdir("java_install_") # 下载 URL (macOS x64) download_url = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_mac_hotspot_11.0.21_9.tar.gz" tar_file = File.join(temp_dir, "openjdk11.tar.gz") if system("curl -L -o \"#{tar_file}\" \"#{download_url}\"") if system("tar -xzf \"#{tar_file}\" -C \"#{temp_dir}\"") # 查找解压后的目录 jdk_dir = Dir.glob(File.join(temp_dir, "jdk-11*")).first if jdk_dir && File.directory?(jdk_dir) # 尝试安装到用户目录而不是系统目录 user_install_dir = File.("~/.pindo/java11") if system("mkdir -p \"#{File.dirname(user_install_dir)}\" && mv \"#{jdk_dir}\" \"#{user_install_dir}\"") # 设置环境变量 ENV['JAVA_HOME'] = user_install_dir return true else # 回退到系统目录 install_dir = "/usr/local/openjdk11" if system("sudo mkdir -p /usr/local && sudo mv \"#{jdk_dir}\" \"#{install_dir}\"") # 设置环境变量 ENV['JAVA_HOME'] = install_dir return true end end end end end return false rescue => e return false ensure # 清理临时目录 FileUtils.rm_rf(temp_dir) if temp_dir && File.directory?(temp_dir) end end |
#replace_unity_jdk_with_java11(jdk_path) ⇒ Object
替换 Unity Editor 中的 JDK 为 Java 11
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 |
# File 'lib/pindo/module/android/java_env_helper.rb', line 518 def replace_unity_jdk_with_java11(jdk_path) begin puts "\e[33m正在替换 Unity Editor JDK 为 Java 11...\e[0m" # 查找系统中的 Java 11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) puts "\e[33m未找到系统中的 Java 11 安装,正在自动下载...\e[0m" # 自动下载并安装 Java 11 if install_java_11 java11_path = find_java11_installation unless java11_path && File.directory?(java11_path) puts "\e[31m✗ Java 11 自动安装失败\e[0m" return false end puts "\e[32m✓ Java 11 自动安装成功\e[0m" else puts "\e[31m✗ Java 11 自动安装失败\e[0m" return false end end puts "找到 Java 11 安装路径: #{java11_path}" # 备份原始 JDK(使用 sudo 权限) backup_path = "#{jdk_path}_backup_#{Time.now.strftime('%Y%m%d_%H%M%S')}" puts "备份原始 JDK 到: #{backup_path}" puts "\e[33m需要管理员权限来备份和替换 Unity Editor JDK,请输入密码...\e[0m" if system("sudo cp -R \"#{jdk_path}\" \"#{backup_path}\"") puts "\e[32m✓ 原始 JDK 备份成功\e[0m" else puts "\e[31m✗ 原始 JDK 备份失败\e[0m" return false end # 删除原始 JDK 内容(使用 sudo 权限) puts "删除原始 JDK 内容..." if system("sudo rm -rf \"#{jdk_path}/*\"") puts "\e[32m✓ 原始 JDK 内容删除成功\e[0m" else puts "\e[31m✗ 原始 JDK 内容删除失败\e[0m" return false end # 复制 Java 11 到 Unity JDK 目录(使用 sudo 权限) puts "复制 Java 11 到 Unity JDK 目录..." if system("sudo cp -R \"#{java11_path}\"/* \"#{jdk_path}/\"") puts "\e[32m✓ Java 11 复制成功\e[0m" # 验证替换结果 new_java_bin = File.join(jdk_path, "bin", "java") if File.exist?(new_java_bin) version_output = `"#{new_java_bin}" -version 2>&1` if version_output =~ /version "(\d+)/ new_version = $1.to_i if new_version >= 11 puts "\e[32m✓ Unity Editor JDK 已成功替换为 Java #{new_version}\e[0m" return true else puts "\e[31m✗ 替换后的 JDK 版本仍然不符合要求: #{new_version}\e[0m" end end end else puts "\e[31m✗ Java 11 复制失败\e[0m" return false end return false rescue => e puts "\e[31m替换 Unity Editor JDK 时出错: #{e.message}\e[0m" return false end end |