Repository navigation
Cut a new project's first build download in half, and gate it - #6213
Conversation
|
Compared 12 screenshots: 12 matched. |
|
Compared 195 screenshots: 195 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
|
Compared 193 screenshots: 193 matched. Benchmark Results
Build and Run Timing
Detailed Performance Metrics
|
|
Compared 231 screenshots: 231 matched. |
Cloudflare Preview
|
|
Compared 188 screenshots: 188 matched. |
|
Compared 192 screenshots: 192 matched. Benchmark Results
Detailed Performance Metrics
|
|
Compared 196 screenshots: 196 matched. Benchmark Results
Detailed Performance Metrics
ParparVM vs HotSpot (JDK 25): macOS arm64Runner CPU: Apple M1 (Virtual) (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 253 screenshots: 253 matched. |
A project from the initializr downloaded 346 MB before its first simulator run. Maven resolves a plugin's whole class path before the first goal, so the build tools' runtime dependencies were every Hello World's: 55 MB of ports no simulator run opens and 157 MB of ffmpeg for seven platforms. It is 174 MB on a Mac now. - The ports are provided and optional in codenameone-maven-plugin and build-engine. AppBuilder.LocalBuild names the ports each local target reads, ProjectHost.getPortJar resolves one at the build tool's own version when that target is built, and Executor.getResourceAsStream reads the class path first and those jars second. Maven and Gradle both do this. - ffmpeg is the host's alone: cn1-binaries-javase selects the natives with OS-activated profiles, and the Gradle plugin mirrors the table. - The desktop jar runs on other machines, so it still carries every desktop platform's natives. javase-executable-jar resolves them itself; a project with a javase module gets them from -Dcn1.ffmpeg.allPlatforms=true, which every generated launcher and cn1:buildExecutableJar pass, and generate-desktop-app-wrapper warns when a launcher does not. scripts/check-first-build-footprint.py (archetype-smoke.yml) generates a project, builds it into an empty local repository and fails on a port, on a native for another platform, on a host with no ffmpeg, or on the budget. It also holds every host's profile to a table, since CI resolves on Linux only. scripts/sync-initializr-launchers.py now fails on any launcher copy that builds the desktop jar without the property. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
The step inherited the JDK 8 the framework builds with, and the plugin refuses a simulator build on anything older than 11. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Passing runs take 35 to 39 minutes there, and the 40 minute limit cancelled the nightly and pull request runs alike. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
0e9a74e to
80f5d98
Compare
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
What a new developer saw
The first thing anyone does with Codename One is run a project from the initializr on a machine that has never built one. That build downloaded 346 MB before the simulator opened. Maven resolves a plugin's whole class path before its first goal, so every runtime dependency of the build tools was downloaded by a Hello World:
It is 174 MB on a Mac now, and less on Linux and Windows, which take one ffmpeg architecture where a Mac takes two.
What changed
providedandoptionalincodenameone-maven-pluginandbuild-engine.AppBuilder.LocalBuildnames the ports each local target reads,ProjectHost.getPortJarresolves one at the build tool's own version, andExecutor.getResourceAsStreamreads the class path first and those jars second. Maven and Gradle behave the same way.cn1-binaries-javaseselects natives with OS-activated profiles; the Gradle plugin mirrors the table inPluginInfo.hostFfmpegPlatforms.javase-executable-jarresolves the other desktop platforms itself. A project with ajavasemodule gets them through-Dcn1.ffmpeg.allPlatforms=true, which every generated launcher (scripts, Eclipse, IntelliJ, NetBeans, VS Code, the Initializr archives) andcn1:buildExecutableJarpass. An older project's launcher gets a build warning naming the property.What stops it growing back
scripts/check-first-build-footprint.py(inarchetype-smoke.yml) generates a project, builds whatrun.shbuilds into an empty local repository, and fails on a port, on a native for another platform, on a host with no ffmpeg, or on the size budget. CI runs on Linux only, so it also holds every host's profile to a table.scripts/sync-initializr-launchers.py(instarter-launchers.yml) fails on any launcher copy that builds the desktop jar without the property, command by command.LocalBuildPortsTest,ExecutorPortJarTest,PortJarSelectionTestandDesktopNativesTestcover the target table, the resource lookup, the Gradle selection and the desktop natives.Verified locally
ios-source,mac-source,local-javascriptandandroid-sourceeach resolve only their own ports from an empty repository, through Maven and through Gradle (gradle-maven-parity-test).javase-module desktop jars both carry the five desktop ffmpeg natives.build-engine,codenameone-maven-pluginandcodenameone-gradle-plugin.The Linux budget is derived from the Mac measurement; the first
archetype-smokerun gives the real figure.🤖 Generated with Claude Code