Skip to content

Commit acd19ea

Browse files
committed
Introduce new JPMS exports to allow running native-image on module-path
Once oracle/graal#4468 gets merged, native-image will run on module-path requiring some additional exports to be passed to it in order to access internal APIs.
1 parent 2df6fc7 commit acd19ea

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/JPMSExportBuildItem.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.deployment.builditem.nativeimage;
22

3+
import java.util.Objects;
4+
35
import io.quarkus.builder.item.MultiBuildItem;
46

57
/**
@@ -22,4 +24,21 @@ public String getPackage() {
2224
public String getModule() {
2325
return moduleName;
2426
}
27+
28+
@Override
29+
public boolean equals(Object o) {
30+
if (this == o) {
31+
return true;
32+
}
33+
if (o == null || getClass() != o.getClass()) {
34+
return false;
35+
}
36+
JPMSExportBuildItem that = (JPMSExportBuildItem) o;
37+
return moduleName.equals(that.moduleName) && packageName.equals(that.packageName);
38+
}
39+
40+
@Override
41+
public int hashCode() {
42+
return Objects.hash(moduleName, packageName);
43+
}
2544
}

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.Collections;
1414
import java.util.HashMap;
15+
import java.util.HashSet;
1516
import java.util.List;
1617
import java.util.Map;
1718
import java.util.Objects;
@@ -23,6 +24,7 @@
2324
import org.jboss.logging.Logger;
2425

2526
import io.quarkus.bootstrap.util.IoUtils;
27+
import io.quarkus.deployment.annotations.BuildProducer;
2628
import io.quarkus.deployment.annotations.BuildStep;
2729
import io.quarkus.deployment.builditem.nativeimage.ExcludeConfigBuildItem;
2830
import io.quarkus.deployment.builditem.nativeimage.JPMSExportBuildItem;
@@ -73,6 +75,12 @@ public class NativeImageBuildStep {
7375
private static final String MOVED_TRUST_STORE_NAME = "trustStore";
7476
public static final String APP_SOURCES = "app-sources";
7577

78+
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
79+
void result(BuildProducer<JPMSExportBuildItem> exports) {
80+
// Needed by io.quarkus.runtime.ResourceHelper.registerResources
81+
exports.produce(new JPMSExportBuildItem("org.graalvm.nativeimage.builder", "com.oracle.svm.core.jdk"));
82+
}
83+
7684
@BuildStep(onlyIf = NativeBuild.class)
7785
ArtifactResultBuildItem result(NativeImageBuildItem image) {
7886
NativeImageBuildItem.GraalVMVersion graalVMVersion = image.getGraalVMInfo();
@@ -807,7 +815,8 @@ public NativeImageInvokerInfo build() {
807815
}
808816

809817
if (jpmsExports != null) {
810-
for (JPMSExportBuildItem jpmsExport : jpmsExports) {
818+
HashSet<JPMSExportBuildItem> deduplicatedJpmsExport = new HashSet<>(jpmsExports);
819+
for (JPMSExportBuildItem jpmsExport : deduplicatedJpmsExport) {
811820
nativeImageArgs.add(
812821
"-J--add-exports=" + jpmsExport.getModule() + "/" + jpmsExport.getPackage() + "=ALL-UNNAMED");
813822
}

core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageAutoFeatureStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.quarkus.deployment.builditem.GeneratedNativeImageClassBuildItem;
2828
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
2929
import io.quarkus.deployment.builditem.nativeimage.ForceNonWeakReflectiveClassBuildItem;
30+
import io.quarkus.deployment.builditem.nativeimage.JPMSExportBuildItem;
3031
import io.quarkus.deployment.builditem.nativeimage.JniRuntimeAccessBuildItem;
3132
import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
3233
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
@@ -108,6 +109,7 @@ GeneratedResourceBuildItem generateNativeResourcesList(List<NativeImageResourceB
108109

109110
@BuildStep
110111
void generateFeature(BuildProducer<GeneratedNativeImageClassBuildItem> nativeImageClass,
112+
BuildProducer<JPMSExportBuildItem> exports,
111113
List<RuntimeInitializedClassBuildItem> runtimeInitializedClassBuildItems,
112114
List<RuntimeInitializedPackageBuildItem> runtimeInitializedPackageBuildItems,
113115
List<RuntimeReinitializedClassBuildItem> runtimeReinitializedClassBuildItems,
@@ -208,6 +210,9 @@ public void write(String s, byte[] bytes) {
208210
}
209211

210212
if (!proxies.isEmpty()) {
213+
// Needed to access DYNAMIC_PROXY_REGISTRY
214+
exports.produce(new JPMSExportBuildItem("org.graalvm.nativeimage.builder", "com.oracle.svm.core.jdk.proxy"));
215+
211216
ResultHandle proxySupportClass = overallCatch.loadClassFromTCCL(DYNAMIC_PROXY_REGISTRY);
212217
ResultHandle proxySupport = overallCatch.invokeStaticMethod(
213218
IMAGE_SINGLETONS_LOOKUP,
@@ -228,6 +233,9 @@ public void write(String s, byte[] bytes) {
228233

229234
/* Resource includes and excludes */
230235
if (!resourcePatterns.isEmpty()) {
236+
// Needed to access LOOKUP_METHOD
237+
exports.produce(new JPMSExportBuildItem("org.graalvm.nativeimage.base", "com.oracle.svm.util"));
238+
231239
ResultHandle resourcesRegistrySingleton = overallCatch.invokeStaticMethod(IMAGE_SINGLETONS_LOOKUP,
232240
overallCatch.loadClassFromTCCL("com.oracle.svm.core.configure.ResourcesRegistry"));
233241
TryBlock tc = overallCatch.tryBlock();
@@ -300,6 +308,9 @@ public void write(String s, byte[] bytes) {
300308
}
301309

302310
if (!resourceBundles.isEmpty()) {
311+
// Needed to access LOCALIZATION_FEATURE
312+
exports.produce(new JPMSExportBuildItem("org.graalvm.nativeimage.builder", "com.oracle.svm.core.jdk.localization"));
313+
303314
AssignableResultHandle registerMethod = overallCatch.createVariable(Method.class);
304315
AssignableResultHandle locClass = overallCatch.createVariable(Class.class);
305316
TryBlock locTryBlock = overallCatch.tryBlock();
@@ -458,6 +469,8 @@ public void write(String s, byte[] bytes) {
458469

459470
if (entry.getValue().serialization) {
460471
if (registerSerializationMethod == null) {
472+
// Needed by createRegisterSerializationForClassMethod to access LOOKUP_METHOD
473+
exports.produce(new JPMSExportBuildItem("org.graalvm.nativeimage.base", "com.oracle.svm.util"));
461474
registerSerializationMethod = createRegisterSerializationForClassMethod(file);
462475
}
463476

0 commit comments

Comments
 (0)