Skip to content

fix: recognise the nested jars of Spring Boot when looking up the token file - #25680

Closed
totally-not-ai[bot] wants to merge 2 commits into
fix/ignore-dev-mode-token-file-from-jarfrom
fix/detect-nested-jars-in-token-file-lookup
Closed

fix: recognise the nested jars of Spring Boot when looking up the token file#25680
totally-not-ai[bot] wants to merge 2 commits into
fix/ignore-dev-mode-token-file-from-jarfrom
fix/detect-nested-jars-in-token-file-lookup

Conversation

@totally-not-ai

Copy link
Copy Markdown
Contributor

Depends on #25649, Follow-up to #6858

behavior deviation · flow-server · applications packaged with
Spring Boot 3.2 or newer, where a dependency also contains a
flow-build-info.json

Background — the token file lookup. The build writes
flow-build-info.json into the build output folder, and the runtime
reads it from the class path at startup. A copy inside a jar is skipped,
unless the application is packaged into a jar itself, in which case its
own file is inside one too and has to be used.

Whether the application is packaged is decided by counting the archives
a resource of flow-server is inside of, and the separator counted for
that is the one Spring Boot used before 3.2. Applications packaged with
a newer Spring Boot therefore never looked packaged, and the file of a
dependency was used whenever the class loader returned it first, giving
the application the settings of the project that built the dependency.

Risks:

  • ⚠️ Behavior change: with several token files inside jars, the one of
    the application is now used instead of the first one found. The old
    order was accidental.
  • ✅ No public API changes, no security, memory, serialization,
    threading or performance impact, nothing to migrate.

Context. Spring Boot 3.2 replaced the nested jar URLs of its own
loader with the nested: protocol, which separates the jar of the
application from an archive inside it with /!, as in
nested:/app.jar/!BOOT-INF/lib/flow-server.jar!/vite.generated.ts. The
lookup only counted jar!/, so it saw one archive where there are two.

  • Counted both the jar!/ and the jar/! separator when working out
    how many archives a resource is inside of, so an application packaged
    with Spring Boot 3.2 or newer is recognised as packaged.
  • Took the least nested token file instead of the first one with exactly
    one archive in its path, which is the file of the application itself
    in both the old and the new packaging.
  • Added a test with the nested jar URLs of Spring Boot, where the file
    of a dependency comes first on the class path.

…en file

The lookup for flow-build-info.json decides that the application is
packaged into a jar by counting the archives the vite.generated.ts of
flow-server is inside of, and then prefers the file in the outermost
archive, which is the one of the application itself.

Spring Boot 3.2 and newer separate the jar of the application from an
archive nested in it with '/!' instead of '!/', so nothing was counted
for it and the application never looked packaged. The file of a
dependency was then used whenever the class loader happened to return it
first.

Both separators are now counted, so the file of the application wins
again.
@totally-not-ai

Copy link
Copy Markdown
Contributor Author

Type of change

  • Bugfix

How to test

This cannot be exercised by hand without packaging an application, so it
is covered by
DefaultApplicationConfigurationFactoryTest.create_nestedJarsOfSpringBoot_tokenFileOfTheApplicationIsUsed,
which fails on the base branch and passes here.

Test coverage

The test mocks the class path of an application packaged with Spring
Boot 3.2 or newer:

  • vite.generated.ts of flow-server at
    nested:/opt/app.jar/!BOOT-INF/lib/flow-server.jar!/vite.generated.ts
  • the token file of a dependency at
    nested:/opt/app.jar/!BOOT-INF/lib/addon.jar!/META-INF/VAADIN/config/flow-build-info.json,
    returned first
  • the token file of the application at
    file:/opt/app.jar!/META-INF/VAADIN/config/flow-build-info.json

The URL formats were taken from spring-boot-loader 4.1.0 rather than
written by hand.

API changes

None. Both changed methods are private.

…t-nested-jars-in-token-file-lookup

# Conflicts:
#	flow-server/src/test/java/com/vaadin/flow/server/startup/DefaultApplicationConfigurationFactoryTest.java
@totally-not-ai

Copy link
Copy Markdown
Contributor Author

Reopened as #25681, which is based on main instead of fix/ignore-dev-mode-token-file-from-jar, so the two changes can be reviewed and merged on their own. Same change, same test.

@totally-not-ai totally-not-ai Bot closed this Sep 11, 2026
@totally-not-ai
totally-not-ai Bot deleted the fix/detect-nested-jars-in-token-file-lookup branch September 11, 2026 17:19
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant