|
30 | 30 | import java.net.URL; |
31 | 31 | import java.nio.file.*; |
32 | 32 | import java.nio.file.attribute.BasicFileAttributes; |
| 33 | +import java.nio.file.attribute.PosixFilePermission; |
33 | 34 | import java.util.*; |
34 | 35 |
|
35 | 36 | import com.sun.jna.platform.FileUtils; |
@@ -424,6 +425,19 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO |
424 | 425 | } |
425 | 426 |
|
426 | 427 | static public File getJavaHome() { |
| 428 | + var resourcesDir = new File(System.getProperty("compose.application.resources.dir")); |
| 429 | + if(resourcesDir.exists()) { |
| 430 | + // find the jdk folder starting with jdk-17 |
| 431 | + var jdkFolder = Arrays.stream(resourcesDir.listFiles((dir, name) -> dir.isDirectory() && name.startsWith("jdk-17"))) |
| 432 | + .findFirst() |
| 433 | + .orElse(null); |
| 434 | + processDirectory(jdkFolder.toPath()); |
| 435 | + if(Platform.isMacOS()){ |
| 436 | + return new File(jdkFolder, "Contents/Home"); |
| 437 | + } |
| 438 | + return jdkFolder; |
| 439 | + } |
| 440 | + |
427 | 441 | var home = System.getProperty("java.home"); |
428 | 442 | if(home != null){ |
429 | 443 | if(new File(home, "bin/java").exists()){ |
@@ -452,6 +466,49 @@ static public File getJavaHome() { |
452 | 466 | return getContentFile("java"); |
453 | 467 | } |
454 | 468 |
|
| 469 | + /** |
| 470 | + * Depcated method to set permissions for all files in a directory. Hotfix for gradle embedded jdk. |
| 471 | + */ |
| 472 | + @Deprecated |
| 473 | + private static void processDirectory(Path directory) { |
| 474 | + try { |
| 475 | + Files.walk(directory) |
| 476 | + .filter(Files::isRegularFile) |
| 477 | + .filter(path -> { |
| 478 | + String fileName = path.getFileName().toString(); |
| 479 | + Path relativePath = directory.relativize(path); |
| 480 | + // Check if file is in a bin directory or has no extension |
| 481 | + return relativePath.toString().contains("bin") || |
| 482 | + !fileName.contains("."); |
| 483 | + }) |
| 484 | + .forEach(file -> { |
| 485 | + try { |
| 486 | + makeExecutable(file); |
| 487 | + } catch (Exception e) { |
| 488 | + System.err.println("Failed to set permissions for " + file + ": " + e.getMessage()); |
| 489 | + } |
| 490 | + }); |
| 491 | + } catch (Exception e) { |
| 492 | + System.err.println("Error walking directory: " + e.getMessage()); |
| 493 | + } |
| 494 | + } |
| 495 | + |
| 496 | + /** |
| 497 | + * Depcated method to set permissions for all files in a directory. Hotfix for gradle embedded jdk. |
| 498 | + */ |
| 499 | + @Deprecated |
| 500 | + private static void makeExecutable(Path file) throws Exception { |
| 501 | + try { |
| 502 | + Set<PosixFilePermission> permissions = new HashSet<>(Files.getPosixFilePermissions(file)); |
| 503 | + permissions.add(PosixFilePermission.OWNER_EXECUTE); |
| 504 | + permissions.add(PosixFilePermission.GROUP_EXECUTE); |
| 505 | + permissions.add(PosixFilePermission.OTHERS_EXECUTE); |
| 506 | + Files.setPosixFilePermissions(file, permissions); |
| 507 | + } catch (UnsupportedOperationException e) { |
| 508 | + // Fallback for non-POSIX systems |
| 509 | + file.toFile().setExecutable(true, false); |
| 510 | + } |
| 511 | + } |
455 | 512 |
|
456 | 513 | /** Get the path to the embedded Java executable. */ |
457 | 514 | static public String getJavaPath() { |
|
0 commit comments