Skip to content

Commit fae3e47

Browse files
authored
Merge pull request #614 from graalvm/vj/adopt-reachability-metadata
Adjust native-build tools to reachability-metadata.json
2 parents fb962b9 + ef4b536 commit fae3e47

File tree

9 files changed

+135
-199
lines changed

9 files changed

+135
-199
lines changed

common/utils/src/main/java/org/graalvm/buildtools/agent/AgentConfiguration.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,21 @@
4040
*/
4141
package org.graalvm.buildtools.agent;
4242

43+
import java.io.File;
44+
import java.io.IOException;
45+
import java.io.InputStream;
4346
import java.io.Serializable;
47+
import java.nio.file.CopyOption;
48+
import java.nio.file.Files;
49+
import java.nio.file.Path;
50+
import java.nio.file.StandardCopyOption;
4451
import java.util.ArrayList;
4552
import java.util.Collection;
4653
import java.util.List;
4754

4855
public class AgentConfiguration implements Serializable {
4956

57+
private static final String DEFAULT_ACCESS_FILTER_FILE = "/access-filter.json";
5058
private final Collection<String> callerFilterFiles;
5159
private final Collection<String> accessFilterFiles;
5260
private final Boolean builtinCallerFilter;
@@ -88,6 +96,7 @@ public AgentConfiguration(Collection<String> callerFilterFiles,
8896
}
8997

9098
public List<String> getAgentCommandLine() {
99+
addDefaultAccessFilter();
91100
List<String> cmdLine = new ArrayList<>(agentMode.getAgentCommandLine());
92101
appendOptionToValues("caller-filter-file=", callerFilterFiles, cmdLine);
93102
appendOptionToValues("access-filter-file=", accessFilterFiles, cmdLine);
@@ -127,4 +136,34 @@ private void addToCmd(String option, Boolean value, List<String> cmdLine) {
127136
}
128137
}
129138

139+
private void addDefaultAccessFilter() {
140+
if (accessFilterFiles == null) {
141+
// this could only happen if we instantiated disabled agent configuration
142+
return;
143+
}
144+
145+
String tempDir = System.getProperty("java.io.tmpdir");
146+
Path agentDir = Path.of(tempDir).resolve("agent-config");
147+
Path accessFilterFile = agentDir.resolve("access-filter.json");
148+
if (Files.exists(accessFilterFile)) {
149+
accessFilterFiles.add(accessFilterFile.toString());
150+
return;
151+
}
152+
153+
try(InputStream accessFilter = AgentConfiguration.class.getResourceAsStream(DEFAULT_ACCESS_FILTER_FILE)) {
154+
if (accessFilter != null) {
155+
if (!Files.exists(agentDir)) {
156+
Files.createDirectory(agentDir);
157+
}
158+
159+
Files.copy(accessFilter, accessFilterFile, StandardCopyOption.REPLACE_EXISTING);
160+
accessFilterFiles.add(accessFilterFile.toString());
161+
} else {
162+
throw new IOException("Cannot find access-filter.json on default location: " + DEFAULT_ACCESS_FILTER_FILE);
163+
}
164+
} catch (IOException e) {
165+
throw new RuntimeException("Cannot add default access-filter.json" ,e);
166+
}
167+
}
168+
130169
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"rules": [
3+
{
4+
"includeClasses": "**"
5+
},
6+
{
7+
"excludeClasses": "org.gradle.**"
8+
},
9+
{
10+
"excludeClasses": "org.junit.**"
11+
}
12+
]
13+
}

native-gradle-plugin/src/functionalTest/groovy/org/graalvm/buildtools/gradle/JavaApplicationWithAgentFunctionalTest.groovy

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,32 @@
4242
package org.graalvm.buildtools.gradle
4343

4444
import org.graalvm.buildtools.gradle.fixtures.AbstractFunctionalTest
45+
import org.graalvm.buildtools.gradle.fixtures.GraalVMSupport
46+
import org.graalvm.buildtools.utils.NativeImageUtils
4547
import spock.lang.Unroll
4648

4749
class JavaApplicationWithAgentFunctionalTest extends AbstractFunctionalTest {
4850

51+
def getCurrentJDKVersion() {
52+
return NativeImageUtils.getMajorJDKVersion(GraalVMSupport.getGraalVMHomeVersionString())
53+
}
54+
55+
def metadataInSingleConfigFile() {
56+
return getCurrentJDKVersion() >= 23
57+
}
58+
59+
def metadataExistsAt(String path) {
60+
if (metadataInSingleConfigFile()) {
61+
return file("${path}/reachability-metadata.json").exists()
62+
}
63+
64+
boolean allFilesExist = ['jni', 'proxy', 'reflect', 'resource', 'serialization'].every { name ->
65+
file("${path}/${name}-config.json").exists()
66+
}
67+
68+
return allFilesExist
69+
}
70+
4971
@Unroll("agent is not passed and the application fails with JUnit Platform #junitVersion")
5072
def "agent is not passed"() {
5173
given:
@@ -94,18 +116,13 @@ class JavaApplicationWithAgentFunctionalTest extends AbstractFunctionalTest {
94116
""".trim()
95117

96118
and:
97-
['jni', 'proxy', 'reflect', 'resource', 'serialization'].each { name ->
98-
assert file("build/native/agent-output/test/${name}-config.json").exists()
99-
}
119+
assert metadataExistsAt("build/native/agent-output/test")
100120

101121
when:
102122
run 'metadataCopy'
103123

104124
then:
105-
['jni', 'proxy', 'reflect', 'resource', 'serialization'].each { name ->
106-
assert file("build/native/metadataCopyTest/${name}-config.json").exists()
107-
}
108-
125+
assert metadataExistsAt("build/native/metadataCopyTest")
109126

110127
where:
111128
junitVersion = System.getProperty('versions.junit')
@@ -125,7 +142,11 @@ class JavaApplicationWithAgentFunctionalTest extends AbstractFunctionalTest {
125142
}
126143

127144
and:
128-
assert file("build/native/agent-output/test/reflect-config.json").text.contains("\"condition\"")
145+
if (metadataInSingleConfigFile()) {
146+
assert file("build/native/agent-output/test/reachability-metadata.json").text.contains("\"condition\"")
147+
} else {
148+
assert file("build/native/agent-output/test/reflect-config.json").text.contains("\"condition\"")
149+
}
129150

130151
where:
131152
junitVersion = System.getProperty('versions.junit')
@@ -148,22 +169,26 @@ class JavaApplicationWithAgentFunctionalTest extends AbstractFunctionalTest {
148169
}
149170

150171
and:
151-
['jni', 'proxy', 'reflect', 'resource', 'serialization'].each { name ->
152-
assert file("build/native/agent-output/run/${name}-config.json").exists()
153-
}
172+
assert metadataExistsAt("build/native/agent-output/run")
154173

155174
when:
156-
run'metadataCopy', '--task', 'run', '--dir', metadata_dir
175+
run 'metadataCopy', '--task', 'run', '--dir', metadata_dir
157176

158177
then:
159-
['jni', 'proxy', 'reflect', 'resource', 'serialization'].each { name ->
160-
assert file("${metadata_dir}/${name}-config.json").exists()
161-
}
178+
assert metadataExistsAt(metadata_dir)
162179

163180
and:
164-
var reflect_config = file("${metadata_dir}/reflect-config.json")
165-
var reflect_config_contents = reflect_config.text
166-
assert reflect_config_contents.contains("DummyClass") && reflect_config_contents.contains("org.graalvm.demo.Message")
181+
if (metadataInSingleConfigFile()) {
182+
var reachabilityMetadata = file("${metadata_dir}/reachability-metadata.json")
183+
var reachabilityMetadataContents = reachabilityMetadata.text
184+
println reachabilityMetadataContents
185+
assert reachabilityMetadataContents.contains("DummyClass"), reachabilityMetadataContents
186+
assert reachabilityMetadataContents.contains("org.graalvm.demo.Message"), reachabilityMetadataContents
187+
} else {
188+
var reflect_config = file("${metadata_dir}/reflect-config.json")
189+
var reflect_config_contents = reflect_config.text
190+
assert reflect_config_contents.contains("DummyClass") && reflect_config_contents.contains("org.graalvm.demo.Message")
191+
}
167192

168193
when:
169194
run 'nativeRun'
@@ -190,9 +215,7 @@ class JavaApplicationWithAgentFunctionalTest extends AbstractFunctionalTest {
190215
}
191216

192217
and:
193-
['jni', 'proxy', 'reflect', 'resource', 'serialization'].each { name ->
194-
assert file("build/native/agent-output/run/${name}-config.json").exists()
195-
}
218+
assert metadataExistsAt("build/native/agent-output/run")
196219

197220
when:
198221
run'run', '-Pagent', '--configuration-cache', '--rerun-tasks'

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import org.graalvm.buildtools.gradle.tasks.NativeRunTask;
6565
import org.graalvm.buildtools.gradle.tasks.actions.CleanupAgentFilesAction;
6666
import org.graalvm.buildtools.gradle.tasks.actions.MergeAgentFilesAction;
67-
import org.graalvm.buildtools.gradle.tasks.actions.ProcessGeneratedGraalResourceFilesAction;
6867
import org.graalvm.buildtools.utils.SharedConstants;
6968
import org.graalvm.reachability.DirectoryConfiguration;
7069
import org.gradle.api.Action;
@@ -871,11 +870,6 @@ public void execute(@Nonnull Task task) {
871870
execOperations));
872871

873872
taskToInstrument.doLast(new CleanupAgentFilesAction(mergeInputDirs, fileOperations));
874-
875-
taskToInstrument.doLast(new ProcessGeneratedGraalResourceFilesAction(
876-
outputDir,
877-
graalExtension.getAgent().getFilterableEntries()
878-
));
879873
}
880874

881875
private static void injectTestPluginDependencies(Project project, Property<Boolean> testSupportEnabled) {

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import org.gradle.jvm.toolchain.JavaToolchainService;
5656

5757
import javax.inject.Inject;
58-
import java.util.Arrays;
5958

6059
public abstract class DefaultGraalVmExtension implements GraalVMExtension {
6160
private final transient NamedDomainObjectContainer<NativeImageOptions> nativeImages;
@@ -79,7 +78,6 @@ public DefaultGraalVmExtension(NamedDomainObjectContainer<NativeImageOptions> na
7978
agentOpts.getEnabled().convention(false);
8079
agentOpts.getModes().getConditional().getParallel().convention(true);
8180
agentOpts.getMetadataCopy().getMergeWithExisting().convention(false);
82-
agentOpts.getFilterableEntries().convention(Arrays.asList("org.gradle.", "org.junit."));
8381
agentOpts.getBuiltinHeuristicFilter().convention(true);
8482
agentOpts.getBuiltinCallerFilter().convention(true);
8583
agentOpts.getEnableExperimentalPredefinedClasses().convention(false);

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/actions/MergeAgentFilesAction.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import java.util.Arrays;
5959
import java.util.Collections;
6060
import java.util.List;
61+
import java.util.Set;
6162
import java.util.function.Supplier;
6263

6364
import static org.graalvm.buildtools.gradle.internal.NativeImageExecutableLocator.findNativeImageExecutable;
@@ -94,8 +95,11 @@ public MergeAgentFilesAction(Provider<Boolean> isMergingEnabled,
9495
this.noLauncherProperty = objectFactory.property(JavaLauncher.class);
9596
}
9697

98+
private static final Set<String> METADATA_FILES = Set.of("reflect-config.json", "jni-config.json", "proxy-config.json", "resource-config.json", "reachability-metadata.json");
99+
97100
private static boolean isConfigDir(String dir) {
98-
return Arrays.stream(new File(dir).listFiles()).anyMatch(file -> file.getName().equals("reflect-config.json"));
101+
return Arrays.stream(new File(dir).listFiles())
102+
.anyMatch(file -> METADATA_FILES.contains(file.getName()));
99103
}
100104

101105
@Override

0 commit comments

Comments
 (0)