Skip to content

Commit 14d11bf

Browse files
committed
Add known inherited properties for ToolExecBase
These inherited properties can also be accessed using `SharedUtil#getForkProperties`. These properties are a combination of known defaults and my best guesses at properties that mussed be passed down to forked JVMs. Gradle, by default (and probably for good reason), does not pass down the Daemon JVM's system properties. This fixes issues with declared proxy settings used by Gradle.
1 parent b887c81 commit 14d11bf

File tree

3 files changed

+106
-9
lines changed

3 files changed

+106
-9
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.gradleutils.shared;
6+
7+
import org.gradle.api.provider.ValueSource;
8+
import org.gradle.api.provider.ValueSourceParameters;
9+
import org.jspecify.annotations.Nullable;
10+
11+
import javax.inject.Inject;
12+
import java.util.HashMap;
13+
import java.util.List;
14+
import java.util.Map;
15+
16+
/// Contains best-guesses at JVM properties that need to be passed into forked JVMs. This is mostly for network access
17+
/// and proxies.
18+
///
19+
/// @see jdk.internal.util.SystemProps#initProperties()
20+
/// @see <a
21+
/// href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/doc-files/net-properties.html">JRE
22+
/// Networking Properties</a>
23+
@SuppressWarnings("JavadocReference")
24+
abstract class JavaForkProperties implements ValueSource<Map<String, String>, ValueSourceParameters.None> {
25+
private static final List<String> CONTAINS = List.of(
26+
"socksProxyHost",
27+
"socksProxyPort",
28+
"socksProxyVersion",
29+
"socksNonProxyHosts"
30+
);
31+
32+
private static final List<String> STARTS_WITH = List.of(
33+
"http.",
34+
"https.",
35+
"ftp.",
36+
"java.net.",
37+
"javax.net.ssl.",
38+
"jdk.tls."
39+
);
40+
41+
private static boolean test(String key) {
42+
if (CONTAINS.contains(key))
43+
return true;
44+
45+
for (var prefix : STARTS_WITH) {
46+
if (key.startsWith(prefix))
47+
return true;
48+
}
49+
50+
return false;
51+
}
52+
53+
@Inject
54+
public JavaForkProperties() { }
55+
56+
@Override
57+
public @Nullable Map<String, String> obtain() {
58+
var systemProperties = System.getProperties();
59+
var forkProperties = new HashMap<String, String>(systemProperties.size());
60+
61+
for (var property : systemProperties.entrySet()) {
62+
var key = property.getKey().toString();
63+
var value = property.getValue().toString();
64+
if (!test(key)) continue;
65+
66+
forkProperties.put(key, value);
67+
}
68+
69+
return forkProperties;
70+
}
71+
}

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import groovy.transform.stc.FirstParam;
1111
import kotlin.jvm.functions.Function0;
1212
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
13-
import org.codehaus.groovy.runtime.InvokerHelper;
1413
import org.gradle.TaskExecutionRequest;
1514
import org.gradle.api.Action;
1615
import org.gradle.api.DomainObjectCollection;
@@ -49,6 +48,7 @@
4948
import java.util.ArrayList;
5049
import java.util.Collection;
5150
import java.util.List;
51+
import java.util.Map;
5252
import java.util.Objects;
5353
import java.util.Set;
5454
import java.util.concurrent.Callable;
@@ -175,6 +175,10 @@ static abstract class ProjectServiceWrapper {
175175
@Inject
176176
public ProjectServiceWrapper() { }
177177
}
178+
179+
public static Provider<Map<String, String>> getForkProperties(ProviderFactory providers) {
180+
return providers.of(JavaForkProperties.class, spec -> { });
181+
}
178182
//endregion
179183

180184
//region Project Eval
@@ -557,7 +561,7 @@ public static <T> Provider<T> asProvider(ProviderFactory providers, Object value
557561
}
558562
//endregion
559563

560-
//region Properties
564+
//region Gradle Properties
561565

562566
/**
563567
* Makes a returning-self closure that finalizes a given property using {@link #finalizeProperty(Property)}.

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolExecBase.java

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.gradle.api.model.ObjectFactory;
2323
import org.gradle.api.plugins.JavaPluginExtension;
2424
import org.gradle.api.provider.ListProperty;
25+
import org.gradle.api.provider.MapProperty;
2526
import org.gradle.api.provider.Property;
2627
import org.gradle.api.provider.Provider;
2728
import org.gradle.api.provider.ProviderConvertible;
@@ -91,6 +92,8 @@ public abstract class ToolExecBase<P extends EnhancedProblems> extends DefaultTa
9192
public abstract @Input @Optional Property<Boolean> getPreferToolchainJvm();
9293

9394
public abstract @Internal DirectoryProperty getWorkingDir();
95+
96+
protected abstract @Internal MapProperty<String, String> getForkProperties();
9497
//endregion
9598

9699
//region Logging
@@ -141,6 +144,8 @@ protected ToolExecBase(Tool tool) {
141144
this.getToolchainLauncher().set(getJavaToolchains().launcherFor(getProject().getExtensions().getByType(JavaPluginExtension.class).getToolchain()))
142145
);
143146

147+
this.getForkProperties().set(SharedUtil.getForkProperties(getProviders()));
148+
144149
this.getStandardOutputLogLevel().convention(LogLevel.LIFECYCLE);
145150
this.getStandardErrorLogLevel().convention(LogLevel.ERROR);
146151

@@ -224,6 +229,10 @@ protected ExecResult exec() throws IOException {
224229
var args = DefaultGroovyMethods.collect(this.args, Closures.<Provider<String>, String>function(Provider::get));
225230
var jvmArgs = DefaultGroovyMethods.collect(this.jvmArgs, Closures.<Provider<String>, String>function(Provider::get));
226231

232+
for (var property : this.getForkProperties().get().entrySet()) {
233+
this.systemProperties.putIfAbsent(property.getKey(), property.getValue());
234+
}
235+
227236
var stdOutLevel = this.getStandardOutputLogLevel().get();
228237
var stdErrLevel = this.getStandardErrorLogLevel().get();
229238

@@ -266,14 +275,27 @@ protected ExecResult exec() throws IOException {
266275
}
267276
));
268277

269-
log.println("Java Launcher: " + spec.getExecutable());
270-
log.println("Working directory: " + spec.getWorkingDir().getAbsolutePath());
271-
log.println("Main class: " + spec.getMainClass().get());
272-
log.println("Arguments: '" + String.join(", ", spec.getArgs()) + '\'');
273-
log.println("JVM Arguments: '" + String.join(", ", spec.getAllJvmArgs()) + '\'');
278+
log.print("Java Launcher: ");
279+
log.println(spec.getExecutable());
280+
log.print("Working directory: ");
281+
log.println(spec.getWorkingDir().getAbsolutePath());
282+
log.print("Main class: ");
283+
log.println(spec.getMainClass().get());
284+
log.println("Arguments:");
285+
for (var s : spec.getArgs()) {
286+
log.print(" ");
287+
log.println(s);
288+
}
289+
log.println("JVM Arguments:");
290+
for (var s : spec.getAllJvmArgs()) {
291+
log.print(" ");
292+
log.println(s);
293+
}
274294
log.println("Classpath:");
275-
for (var f : getClasspath())
276-
log.println(" - " + f.getAbsolutePath());
295+
for (var f : getClasspath()) {
296+
log.print(" ");
297+
log.println(f.getAbsolutePath());
298+
}
277299
log.println("====================================");
278300
});
279301
}

0 commit comments

Comments
 (0)