Skip to content

Commit 1671dce

Browse files
committed
Make deployment class loader resettable and coordinate the reset via build item/step
1 parent 8304773 commit 1671dce

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.quarkus.deployment.builditem;
2+
3+
import java.util.Map;
4+
5+
import io.quarkus.builder.item.MultiBuildItem;
6+
7+
public final class AdditionalClassLoaderResourcesBuildItem extends MultiBuildItem {
8+
9+
final Map<String, byte[]> resources;
10+
11+
public AdditionalClassLoaderResourcesBuildItem(Map<String, byte[]> resources) {
12+
this.resources = resources;
13+
}
14+
15+
public Map<String, byte[]> getResources() {
16+
return resources;
17+
}
18+
19+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.quarkus.deployment.steps;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.LinkedHashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Map.Entry;
9+
10+
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
11+
import io.quarkus.deployment.annotations.BuildProducer;
12+
import io.quarkus.deployment.annotations.BuildStep;
13+
import io.quarkus.deployment.builditem.AdditionalClassLoaderResourcesBuildItem;
14+
import io.quarkus.deployment.builditem.AdditionalIndexedClassesBuildItem;
15+
16+
public class AdditionalClassLoaderResourcesBuildStep {
17+
18+
@BuildStep
19+
void appendAdditionalClassloaderResources(BuildProducer<AdditionalIndexedClassesBuildItem> producer,
20+
List<AdditionalClassLoaderResourcesBuildItem> additionalResources) {
21+
22+
if (!additionalResources.isEmpty()) {
23+
QuarkusClassLoader cl = (QuarkusClassLoader) Thread.currentThread().getContextClassLoader();
24+
25+
Map<String, byte[]> collected = new LinkedHashMap<String, byte[]>();
26+
List<String> additionalClassesToIndex = new ArrayList<String>();
27+
for (AdditionalClassLoaderResourcesBuildItem item : additionalResources) {
28+
29+
for (Entry<String, byte[]> entry : item.getResources().entrySet()) {
30+
additionalClassesToIndex.add(entry.getKey());
31+
32+
collected.put(entry.getKey(), entry.getValue());
33+
// add it also as resources to allow index to work properly
34+
collected.put(entry.getKey().replace('.', '/') + ".class", entry.getValue());
35+
36+
}
37+
}
38+
39+
cl.reset(collected, Collections.emptyMap());
40+
// produce the AdditionalIndexedClassesBuildItem so this build step
41+
// is actually invoked and allow to directly index all the classes
42+
producer.produce(new AdditionalIndexedClassesBuildItem(additionalClassesToIndex.stream().toArray(String[]::new)));
43+
}
44+
}
45+
}

independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/app/CuratedApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ public QuarkusClassLoader createDeploymentClassLoader() {
256256
builder.addElement(ClassPathElement.fromPath(root));
257257
}
258258

259+
builder.setResettableElement(new MemoryClassPathElement(Collections.emptyMap()));
260+
259261
//additional user class path elements first
260262
for (AdditionalDependency i : quarkusBootstrap.getAdditionalApplicationArchives()) {
261263
for (Path root : i.getArchivePath()) {

0 commit comments

Comments
 (0)