Changes since 25.1.0
Fixes
-
Detect incompatible Jackson version at startup (#24009) (CP: 25.1)
Commit · Pull requestThis PR cherry-picks changes from the original PR #24009 to branch 25.1. --- #### Original PR description > Vaadin requires Jackson 3.1+ but Spring Boot 4.0.3 and earlier ship Jackson 3.0 which has incompatible API changes. This caused a cryptic NoSuchMethodError at runtime. Adding an early check in VaadinService.init() surfaces a clear error message with remediation steps instead. >
-
Shade asm into flow-build-tools (#24025)
Commit · Pull request · IssueShades ASM into flow-build-tools and relocates classes to an internal package. Prevents build time errors with projects that depend on older ASM versions.
-
Remove type parameter from Signal.effect (#24022)
Commit · Pull request · IssueThe removal of type parameter T from the Signal.effect methods is binary-compatible and source-compatible.
-
Add missing
registerStylesimport to generated app-shell-imports.js (#23975)
Commit · Pull request · IssueThe generated
app-shell-imports.jsfile was missing theTHEMABLE_MIXIN_IMPORTline (import { css, unsafeCSS, registerStyles }), causingReferenceError: registerStyles is not definedat startup in production mode when@CssImportwiththemeForwas used on anAppShellConfigurator. Also ensures import statements are moved to the top of the generated app shell file, consistent with other generated import files. -
Prevent duplicated CSS imports in web component generated file (#23984)
Commit · Pull request · IssueWhen a CSS file is referenced by both a regular component and a WebComponentExporter (or AppShellConfigurator), the generated web component imports file contained duplicate import statements and duplicate style registrations for the same CSS. This happened because the web component output merges multiple independently generated files, and the existing string-based deduplication could not recognize that two imports for the same file were equivalent. The fix detects duplicate CSS file imports after merging and unifies their variable references so that identical style registrations are properly deduplicated, while preserving distinct registrations when the same CSS file is intentionally used with different configurations.
-
Use UI identity for background change detection in Effect (#23980)
Commit · Pull request · IssueEffectContext.isBackgroundChange() always returned false for shared signals modified by another user's session because the check only looked at VaadinRequest.getCurrent(), which is non-null on any request thread. Now Effect tracks its owner UI and compares UI.getCurrent() against it, correctly detecting cross-session changes as background changes.
-
Prevent computed signal from being evaluated twice during binding (#23972)
Commit · Pull request · IssuePreviously, when creating a signal binding (e.g., bindText, bindProperty), the signal was evaluated twice: 1. Once via signal.peek() to initialize the previousValue 2. Once via signal.get() during the first effect execution This was inefficient, especially for expensive computed signals. The fix removes the signal.peek() call and instead tracks whether the effect has run before using a hasRun flag. On the first execution, oldValue is set to newValue (maintaining the contract that they are equal on initial run). On subsequent executions, oldValue comes from the previousValue array. 🤖 Generated with Claude Code ---------
-
Prevent stale JAR cache in
Reflectorunder Maven daemon (mvnd) (#23863)
Commit · Pull requestMirror the Gradle daemon fix (33fa374) in the Maven plugin's
ReflectorandReflectorClassLoader/CombinedClassLoader: - ExtractReflectionsClassFinder.disableJarCaching()as a public utility so both plugins can reuse it. - Wrapjar:URLs inReflectorClassLoader.getResource()andgetResources()(flow-maven-plugin) andCombinedClassLoader(flow-dev-bundle-plugin) withuseCaches(false)to prevent staleJarFileFactoryentries across daemon builds. - MakeReflectorimplementCloseablewith aclose()method that releases theURLClassLoaderfile handles, and register aCleaneraction for best-effort GC cleanup of abandoned instances. - Close the temporaryReflectorinFlowModeAbstractMojo.isHillaAvailable(MavenProject)via try-with-resources. Releated to #15458 -
Prevent stale JAR cache in
ReflectionsClassFinderunder Gradle daemon (CP: 25.1)
Commit · Pull request · IssueClose
URLClassLoaderon cleanup to release JAR file handles, and disable JVM-level JAR caching ingetResource()by wrappingjar:URLs with aURLStreamHandlerthat setsuseCaches(false). The Gradle daemon reuses JVMs across builds. When a sibling module's JAR is rewritten, two independent caching layers can hold stale file handles: 1.URLClassLoaderinternal cache (URLClassPath→JarLoader) 2.JarFileFactorystatic HashMap (populated viaJarURLConnection) TheURLClassLoader.close()call addresses layer 1, but layer 2 is JVM-global and independent of the class loader. SettinguseCaches(false)onjar:URL connections preventsJarFileFactoryfrom cachingJarFileinstances, matching the approach used by Spring'sPathMatchingResourcePatternResolver(SPR-4639).