Skip to content

Commit 78ccb94

Browse files
ivan-ristovicbulasevich
authored andcommitted
Add system modules implicitly required by the application to the image builder module graph
(cherry picked from commit c23e853aa9edaf22c913425f74c60dddb7b3d54b)
1 parent 7332df5 commit 78ccb94

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/NativeImage.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.io.InputStream;
3131
import java.io.InputStreamReader;
3232
import java.lang.module.FindException;
33+
import java.lang.module.ModuleDescriptor;
3334
import java.lang.module.ModuleFinder;
3435
import java.lang.module.ModuleReference;
3536
import java.lang.reflect.Method;
@@ -53,8 +54,10 @@
5354
import java.util.List;
5455
import java.util.ListIterator;
5556
import java.util.Map;
57+
import java.util.Objects;
5658
import java.util.Optional;
5759
import java.util.Properties;
60+
import java.util.Queue;
5861
import java.util.Set;
5962
import java.util.StringJoiner;
6063
import java.util.function.BiConsumer;
@@ -1598,6 +1601,15 @@ protected int buildImage(List<String> javaArgs, LinkedHashSet<Path> cp, LinkedHa
15981601
}
15991602
List<Path> finalImageModulePath = applicationModules.values().stream().toList();
16001603

1604+
/*
1605+
* Make sure to add all system modules required by the application that might not be part of
1606+
* the boot module layer of image builder. If we do not do this, the image builder will fail
1607+
* to create the image-build module layer, as it will attempt to define system modules to
1608+
* the host VM.
1609+
*/
1610+
Set<String> implicitlyRequiredSystemModules = getImplicitlyRequiredSystemModules(finalImageModulePath);
1611+
addModules.addAll(implicitlyRequiredSystemModules);
1612+
16011613
if (!addModules.isEmpty()) {
16021614

16031615
arguments.add("-D" + ModuleSupport.PROPERTY_IMAGE_EXPLICITLY_ADDED_MODULES + "=" +
@@ -1788,6 +1800,41 @@ private Map<String, Path> getModulesFromPath(Collection<Path> modulePath) {
17881800
return mrefs;
17891801
}
17901802

1803+
private Set<String> getImplicitlyRequiredSystemModules(Collection<Path> modulePath) {
1804+
if (!config.modulePathBuild || modulePath.isEmpty()) {
1805+
return Set.of();
1806+
}
1807+
1808+
ModuleFinder systemModuleFinder = ModuleFinder.ofSystem();
1809+
ModuleFinder appModuleFinder = ModuleFinder.of(modulePath.toArray(Path[]::new));
1810+
ModuleFinder finder = ModuleFinder.compose(appModuleFinder, systemModuleFinder);
1811+
Map<String, ModuleReference> modules = finder.findAll().stream()
1812+
.collect(Collectors.toMap(m -> m.descriptor().name(), m -> m));
1813+
1814+
Set<String> applicationModulePathRequiredModules = new HashSet<>();
1815+
Queue<ModuleReference> discoveryQueue = new ArrayDeque<>(modules.values());
1816+
1817+
while (!discoveryQueue.isEmpty()) {
1818+
ModuleReference module = discoveryQueue.poll();
1819+
Set<String> requiredModules = getRequiredModules(module);
1820+
List<ModuleReference> requiredModuleReferences = requiredModules.stream()
1821+
.map(mn -> modules.getOrDefault(mn, null))
1822+
.filter(Objects::nonNull)
1823+
.toList();
1824+
discoveryQueue.addAll(requiredModuleReferences);
1825+
applicationModulePathRequiredModules.addAll(requiredModules);
1826+
}
1827+
1828+
applicationModulePathRequiredModules.retainAll(getBuiltInModules());
1829+
return applicationModulePathRequiredModules;
1830+
}
1831+
1832+
private static Set<String> getRequiredModules(ModuleReference mref) {
1833+
return mref.descriptor().requires().stream()
1834+
.map(ModuleDescriptor.Requires::name)
1835+
.collect(Collectors.toSet());
1836+
}
1837+
17911838
boolean useBundle() {
17921839
return bundleSupport != null;
17931840
}

0 commit comments

Comments
 (0)