From bc29bb0c912790e4c2a7e16df64a945d7ad59e23 Mon Sep 17 00:00:00 2001 From: "youngjin.kim2" Date: Wed, 15 Jun 2022 12:41:56 +0900 Subject: [PATCH] [#8890] Define ModuleLayer of 'pinpoint.module' explicitly --- .../pinpoint/bootstrap/module/Providers.java | 8 +++ .../java9/module/InternalModules.java | 21 ++++++-- .../java9/module/SingleModuleFinder.java | 53 +++++++++++++++++++ .../java9/module/JarFileAnalyzer.java | 3 +- 4 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/SingleModuleFinder.java diff --git a/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/module/Providers.java b/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/module/Providers.java index f6475c56033e..f4498f4a0731 100644 --- a/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/module/Providers.java +++ b/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/module/Providers.java @@ -35,6 +35,14 @@ public String getService() { return services; } + public String getServicePackage() { + int lastDotIndex = services.lastIndexOf('.'); + if (lastDotIndex == -1) { + return services; + } + return services.substring(0, lastDotIndex); + } + public List getProviders() { return providers; } diff --git a/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/InternalModules.java b/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/InternalModules.java index f0fe8ff3234b..521ebe13bb19 100644 --- a/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/InternalModules.java +++ b/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/InternalModules.java @@ -19,8 +19,13 @@ import jdk.internal.loader.BootLoader; import jdk.internal.module.Modules; +import java.lang.module.Configuration; import java.lang.module.ModuleDescriptor; +import java.lang.module.ModuleFinder; import java.net.URI; +import java.util.List; +import java.util.Objects; +import java.util.Set; final class InternalModules { @@ -28,7 +33,7 @@ private InternalModules() { } /** - * Returns the unnamed module for the boot loader. + * Returns the unnamed module for the bootloader. */ static Module getUnnamedModule() { return BootLoader.getUnnamedModule(); @@ -47,14 +52,24 @@ static Module defineModule(ClassLoader loader, ModuleDescriptor descriptor, URI uri) { - return Modules.defineModule(loader, descriptor, uri); + final String moduleName = descriptor.name(); + final ModuleLayer parent = ModuleLayer.boot(); + + final ModuleFinder before = new SingleModuleFinder(descriptor, uri); + final Configuration cf = parent.configuration().resolve(before, ModuleFinder.of(), Set.of(moduleName)); + final Module module = ModuleLayer.defineModules(cf, List.of(parent), name -> loader) + .layer() + .findModule(moduleName) + .orElse(null); + + return Objects.requireNonNull(module, moduleName); } /** * Called by the VM to load a system module, typically "java.instrument" or * "jdk.management.agent". If the module is not loaded then it is resolved - * and loaded (along with any dependences that weren't previously loaded) + * and loaded (along with any dependencies that weren't previously loaded) * into a child layer. */ static Module loadModule(String name) { diff --git a/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/SingleModuleFinder.java b/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/SingleModuleFinder.java new file mode 100644 index 000000000000..abe4f45cc938 --- /dev/null +++ b/bootstraps/bootstrap-java9-internal/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/SingleModuleFinder.java @@ -0,0 +1,53 @@ +/* + * Copyright 2022 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.bootstrap.java9.module; + +import java.lang.module.ModuleDescriptor; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReader; +import java.lang.module.ModuleReference; +import java.net.URI; +import java.util.Optional; +import java.util.Set; + +/** + * @author youngjin.kim2 + */ +public class SingleModuleFinder implements ModuleFinder { + private final ModuleReference target; + + public SingleModuleFinder(ModuleDescriptor descriptor, URI uri) { + this.target = new ModuleReference(descriptor, uri) { + @Override + public ModuleReader open() { + throw new RuntimeException("open must not be called"); + } + }; + } + + @Override + public Optional find(String name) { + if (target.descriptor().name().equals(name)) { + return Optional.of(target); + } + return Optional.empty(); + } + + @Override + public Set findAll() { + return Set.of(target); + } +} diff --git a/bootstraps/bootstrap-java9/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/JarFileAnalyzer.java b/bootstraps/bootstrap-java9/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/JarFileAnalyzer.java index 41d69da975ba..aae724b01327 100644 --- a/bootstraps/bootstrap-java9/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/JarFileAnalyzer.java +++ b/bootstraps/bootstrap-java9/src/main/java/com/navercorp/pinpoint/bootstrap/java9/module/JarFileAnalyzer.java @@ -68,6 +68,7 @@ public PackageInfo analyze() { final Providers provides = this.serviceLoaderEntryFilter.filter(jarEntry); if (provides != null) { + packageSet.add(provides.getServicePackage()); providesList.add(provides); } } @@ -124,7 +125,7 @@ public String filter(JarEntry jarEntry) { final String fileName = jarEntry.getName(); if (!checkFIleExtension(fileName, CLASS_EXTENSION)) { - // skip non class file + // skip non-class file return null; }