Skip to content

Commit 23f20ba

Browse files
committed
Add directory based locater, and some default directories.
1 parent d25ee6a commit 23f20ba

File tree

5 files changed

+121
-1
lines changed

5 files changed

+121
-1
lines changed

src/main/java/net/minecraftforge/java_provisioner/Disco.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,10 @@ private Arch(Arch parent, String key, String... names) {
607607
this.names = names;
608608
}
609609

610+
public boolean is64Bit() {
611+
return this == X64 || this == AMD64 || this == ARM64 || this == X86_64 || this == AARCH64 || this == PPC64 || this == PPC64EL || this == RISCV64;
612+
}
613+
610614
public String key() {
611615
return this.key;
612616
}

src/main/java/net/minecraftforge/java_provisioner/DiscoMain.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static void main(String[] args) throws Exception {
2222
parser.allowsUnrecognizedOptions();
2323
OptionSpec<Void> helpO = parser.accepts("help", "Displays this help message and exits");
2424

25-
parser.accepts("disco-main", "Instructs the executable jar to use the DiscoMain entry point");
25+
parser.accepts("disco-main", "Use the DiscoMain entry point");
2626

2727
OptionSpec<File> cacheO = parser.accepts("cache",
2828
"Directory to store data needed for this program")
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.java_provisioner;
6+
7+
import java.io.File;
8+
import java.util.ArrayList;
9+
import java.util.Collection;
10+
import java.util.List;
11+
12+
import net.minecraftforge.java_provisioner.Disco.Arch;
13+
import net.minecraftforge.java_provisioner.api.IJavaInstall;
14+
import net.minecraftforge.java_provisioner.util.OS;
15+
import net.minecraftforge.java_provisioner.util.ProcessUtils;
16+
17+
/*
18+
* Attempts to find the java install from specific folders.
19+
* Will search the folder, and immediate sub-folders.
20+
*/
21+
public class JavaDirectoryLocator extends JavaHomeLocator {
22+
private final Collection<File> paths;
23+
24+
private static Collection<File> guesses() {
25+
Collection<File> ret = new ArrayList<>();
26+
if (OS.CURRENT == OS.WINDOWS) { // Windows
27+
File[] roots = File.listRoots();
28+
for(int i = 0; i < roots.length ; i++) {
29+
ret.add(new File(roots[i], "Program Files\\Java"));
30+
if (Arch.CURRENT.is64Bit())
31+
ret.add(new File(roots[i], "Program Files (x86)\\Java"));
32+
}
33+
} else if (OS.CURRENT == OS.OSX) { // Mac
34+
ret.add(new File("/Library/Java/JavaVirtualMachines"));
35+
} else { // Linux
36+
ret.add(new File("/usr/java"));
37+
ret.add(new File("/usr/lib/jvm"));
38+
ret.add(new File("/usr/lib64/jvm"));
39+
ret.add(new File("/usr/local/"));
40+
ret.add(new File("/opt"));
41+
ret.add(new File("/app/jdk"));
42+
ret.add(new File("/opt/jdk"));
43+
ret.add(new File("/opt/jdks"));
44+
}
45+
46+
ret.removeIf(f -> !f.exists() || !f.isDirectory());
47+
48+
return ret;
49+
}
50+
51+
52+
public JavaDirectoryLocator() {
53+
this(guesses());
54+
}
55+
56+
public JavaDirectoryLocator(Collection<File> paths) {
57+
this.paths = expand(paths);
58+
}
59+
60+
private Collection<File> expand(Collection<File> files) {
61+
Collection<File> ret = new ArrayList<>();
62+
String exe = "bin/java" + OS.CURRENT.exe();
63+
for (File file : files) {
64+
if (new File(file, exe).exists())
65+
ret.add(file);
66+
else {
67+
File[] subFiles = file.listFiles();
68+
if (subFiles != null) {
69+
for (File subFile : subFiles) {
70+
if (subFile.isDirectory() && new File(subFile, exe).exists())
71+
ret.add(subFile);
72+
}
73+
}
74+
}
75+
}
76+
return ret;
77+
}
78+
79+
@Override
80+
public File find(int version) {
81+
for (File path : paths) {
82+
IJavaInstall result = fromPath(path);
83+
if (result != null && result.majorVersion() == version)
84+
return result.home();
85+
}
86+
return null;
87+
}
88+
89+
@Override
90+
public List<IJavaInstall> findAll() {
91+
List<IJavaInstall> ret = new ArrayList<>();
92+
for (File path : paths) {
93+
IJavaInstall result = fromPath(path);
94+
if (result != null)
95+
ret.add(result);
96+
}
97+
return ret;
98+
}
99+
}

src/main/java/net/minecraftforge/java_provisioner/Main.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public static void main(String[] args) throws Exception {
6363
List<IJavaLocator> locators = new ArrayList<>();
6464
locators.add(new JavaHomeLocator());
6565
locators.add(new GradleLocator());
66+
locators.add(new JavaDirectoryLocator());
6667
locators.add(disco);
6768

6869
if (options.has(testO)) {

src/main/java/net/minecraftforge/java_provisioner/api/IJavaLocator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
package net.minecraftforge.java_provisioner.api;
66

77
import java.io.File;
8+
import java.util.Arrays;
89
import java.util.List;
910

1011
import net.minecraftforge.java_provisioner.DiscoLocator;
1112
import net.minecraftforge.java_provisioner.GradleLocator;
13+
import net.minecraftforge.java_provisioner.JavaDirectoryLocator;
1214
import net.minecraftforge.java_provisioner.JavaHomeLocator;
1315

1416
public interface IJavaLocator {
@@ -58,6 +60,20 @@ static IJavaLocator home() {
5860
return new JavaHomeLocator();
5961
}
6062

63+
/**
64+
* Returns a locator that searches a set of default 'guessed' directories based on OS.
65+
*/
66+
static IJavaLocator paths() {
67+
return new JavaDirectoryLocator();
68+
}
69+
70+
/**
71+
* Returns a locator that searches the specified directories, and immediate sub-directories.
72+
*/
73+
static IJavaLocator paths(File... dirs) {
74+
return new JavaDirectoryLocator(Arrays.asList(dirs));
75+
}
76+
6177
/**
6278
* Returns a new locator that implements the Disco API, using the specified directory as its download cache.
6379
*/

0 commit comments

Comments
 (0)