@@ -62,6 +62,8 @@ public class Repackager {
62
62
63
63
private static final String BOOT_CLASSPATH_INDEX_ATTRIBUTE = "Spring-Boot-Classpath-Index" ;
64
64
65
+ private static final String BOOT_LAYERS_INDEX_ATTRIBUTE = "Spring-Boot-Layers-Index" ;
66
+
65
67
private static final byte [] ZIP_FILE_HEADER = new byte [] { 'P' , 'K' , 3 , 4 };
66
68
67
69
private static final long FIND_WARNING_TIMEOUT = TimeUnit .SECONDS .toMillis (10 );
@@ -80,6 +82,8 @@ public class Repackager {
80
82
81
83
private LayoutFactory layoutFactory ;
82
84
85
+ private Layers layers = Layers .IMPLICIT ;
86
+
83
87
public Repackager (File source ) {
84
88
this (source , null );
85
89
}
@@ -128,6 +132,16 @@ public void setLayout(Layout layout) {
128
132
this .layout = layout ;
129
133
}
130
134
135
+ /**
136
+ * Sets the layers that should be used in the jar.
137
+ * @param layers the jar layers
138
+ * @see LayeredLayout
139
+ */
140
+ public void setLayers (Layers layers ) {
141
+ Assert .notNull (layers , "Layers must not be null" );
142
+ this .layers = layers ;
143
+ }
144
+
131
145
/**
132
146
* Sets the layout factory for the jar. The factory can be used when no specific
133
147
* layout is specified.
@@ -244,7 +258,7 @@ else if (this.layout.isExecutable()) {
244
258
245
259
private EntryTransformer getEntityTransformer () {
246
260
if (this .layout instanceof RepackagingLayout ) {
247
- return new RepackagingEntryTransformer ((RepackagingLayout ) this .layout );
261
+ return new RepackagingEntryTransformer ((RepackagingLayout ) this .layout , this . layers );
248
262
}
249
263
return EntryTransformer .NONE ;
250
264
}
@@ -328,14 +342,23 @@ protected String findMainMethod(JarFile source) throws IOException {
328
342
329
343
private void addBootAttributes (Attributes attributes ) {
330
344
attributes .putValue (BOOT_VERSION_ATTRIBUTE , getClass ().getPackage ().getImplementationVersion ());
331
- if (this .layout instanceof RepackagingLayout ) {
345
+ if (this .layout instanceof LayeredLayout ) {
346
+ addBootBootAttributesForLayeredLayout (attributes , (LayeredLayout ) this .layout );
347
+ }
348
+ else if (this .layout instanceof RepackagingLayout ) {
332
349
addBootBootAttributesForRepackagingLayout (attributes , (RepackagingLayout ) this .layout );
333
350
}
334
351
else {
335
352
addBootBootAttributesForPlainLayout (attributes , this .layout );
336
353
}
337
354
}
338
355
356
+ private void addBootBootAttributesForLayeredLayout (Attributes attributes , LayeredLayout layout ) {
357
+ String layersIndexFileLocation = layout .getLayersIndexFileLocation ();
358
+ putIfHasLength (attributes , BOOT_LAYERS_INDEX_ATTRIBUTE , layersIndexFileLocation );
359
+ putIfHasLength (attributes , BOOT_CLASSPATH_INDEX_ATTRIBUTE , layout .getClasspathIndexFileLocation ());
360
+ }
361
+
339
362
private void addBootBootAttributesForRepackagingLayout (Attributes attributes , RepackagingLayout layout ) {
340
363
attributes .putValue (BOOT_CLASSES_ATTRIBUTE , layout .getRepackagedClassesLocation ());
341
364
putIfHasLength (attributes , BOOT_LIB_ATTRIBUTE , this .layout .getLibraryLocation ("" , LibraryScope .COMPILE ));
@@ -388,8 +411,11 @@ private static final class RepackagingEntryTransformer implements EntryTransform
388
411
389
412
private final RepackagingLayout layout ;
390
413
391
- private RepackagingEntryTransformer (RepackagingLayout layout ) {
414
+ private final Layers layers ;
415
+
416
+ private RepackagingEntryTransformer (RepackagingLayout layout , Layers layers ) {
392
417
this .layout = layout ;
418
+ this .layers = layers ;
393
419
}
394
420
395
421
@ Override
@@ -400,7 +426,7 @@ public JarArchiveEntry transform(JarArchiveEntry entry) {
400
426
if (!isTransformable (entry )) {
401
427
return entry ;
402
428
}
403
- String transformedName = this . layout . getRepackagedClassesLocation () + entry .getName ();
429
+ String transformedName = transformName ( entry .getName () );
404
430
JarArchiveEntry transformedEntry = new JarArchiveEntry (transformedName );
405
431
transformedEntry .setTime (entry .getTime ());
406
432
transformedEntry .setSize (entry .getSize ());
@@ -425,6 +451,15 @@ public JarArchiveEntry transform(JarArchiveEntry entry) {
425
451
return transformedEntry ;
426
452
}
427
453
454
+ private String transformName (String name ) {
455
+ if (this .layout instanceof LayeredLayout ) {
456
+ Layer layer = this .layers .getLayer (name );
457
+ Assert .state (layer != null , "Invalid 'null' layer from " + this .layers .getClass ().getName ());
458
+ return ((LayeredLayout ) this .layout ).getRepackagedClassesLocation (layer ) + name ;
459
+ }
460
+ return this .layout .getRepackagedClassesLocation () + name ;
461
+ }
462
+
428
463
private boolean isTransformable (JarArchiveEntry entry ) {
429
464
String name = entry .getName ();
430
465
if (name .startsWith ("META-INF/" )) {
@@ -456,7 +491,14 @@ private WritableLibraries(Libraries libraries) throws IOException {
456
491
}
457
492
458
493
private String getLocation (Library library ) {
459
- return Repackager .this .layout .getLibraryLocation (library .getName (), library .getScope ());
494
+ Layout layout = Repackager .this .layout ;
495
+ if (layout instanceof LayeredLayout ) {
496
+ Layers layers = Repackager .this .layers ;
497
+ Layer layer = layers .getLayer (library );
498
+ Assert .state (layer != null , "Invalid 'null' library layer from " + layers .getClass ().getName ());
499
+ return ((LayeredLayout ) layout ).getLibraryLocation (library .getName (), library .getScope (), layer );
500
+ }
501
+ return layout .getLibraryLocation (library .getName (), library .getScope ());
460
502
}
461
503
462
504
@ Override
0 commit comments