Releases: codellm-devkit/codeanalyzer-java
Release list
v3.1.0
Install
pip install codeanalyzer-java==3.1.0 # bundles a JVM; installs the canjv launcherOr the jar with a codeanalyzer launcher (requires Java 11+):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v3.1.0/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
# JSON output, at the analysis level you ask for
java -jar codeanalyzer.jar -i /path/to/project -a 4 -o ./out # writes out/analysis.json
# Neo4j projection - always full depth, so it takes no --analysis-level
java -jar codeanalyzer.jar -i /path/to/project --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
📦 Other Changes
- feat(config): config-read literal tier — J_USES_CONFIG and J_READS_CONFIG_UNRESOLVED
- PR: #233
- feat(entrypoints): report on the application root, framework attribution on the node
- PR: #235
- feat(config): dataflow tiers — close non-literal keys over the L3 DDG and L4 call graph
- PR: #237
- docs(schema): stop calling the graph contract 2.2.0
- PR: #238
- chore(release): 3.1.0
- PR: #239
v3.0.3
Install
pip install codeanalyzer-java==3.0.3 # bundles a JVM; installs the canjv launcherOr the jar with a codeanalyzer launcher (requires Java 11+):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v3.0.3/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
# JSON output, at the analysis level you ask for
java -jar codeanalyzer.jar -i /path/to/project -a 4 -o ./out # writes out/analysis.json
# Neo4j projection - always full depth, so it takes no --analysis-level
java -jar codeanalyzer.jar -i /path/to/project --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
📦 Other Changes
v3.0.2
Install
pip install codeanalyzer-java==3.0.2 # bundles a JVM; installs the canjv launcherOr the jar with a codeanalyzer launcher (requires Java 11+):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v3.0.2/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
# JSON output, at the analysis level you ask for
java -jar codeanalyzer.jar -i /path/to/project -a 4 -o ./out # writes out/analysis.json
# Neo4j projection - always full depth, so it takes no --analysis-level
java -jar codeanalyzer.jar -i /path/to/project --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
📦 Other Changes
v3.0.1
Install
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v3.0.1/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
# JSON output, at the analysis level you ask for
java -jar codeanalyzer.jar -i /path/to/project -a 4 -o ./out # writes out/analysis.json
# Neo4j projection - always full depth, so it takes no --analysis-level
java -jar codeanalyzer.jar -i /path/to/project --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
What's changed in 3.0.1
Fixed
--emit neo4jno longer fails on a large repository. The whole Cypher script was built as oneStringbefore a byte was written, and a script containing any non-Latin-1 character is stored as UTF16 — capping it at ~1.07 billion characters. ThingsBoard v4.0 renders 1.169 billion, so the run died withOutOfMemoryErrorand left a zero-bytegraph.cypher. Not heap exhaustion: no-Xmxavoided it. The writer now streams, so peak memory is one batch rather than the whole graph. (#211)- An incremental Bolt push can no longer delete a graph it did not write. Two separate defects, both fixed:
- It matched
_modulewith no label at all. Sibling analyzers set that same property to the same value, so wherever a file key collided across languages, a java push deleted their nodes. (#213) - Even labelled, it was application-blind —
_moduleis a bare project-relative path, so two java applications sharingsrc/main/java/Foo.javadeleted each other's nodes for that file. No label could fix that: both applications' nodes are identical apart from identity. Deletion is now scoped by the module's owncan://id. (#218)
- It matched
- Configuration XML is recognized rather than assumed. Every
*.xmlwas flattened into config keys, so data files became configuration: ThingsBoard emitted 42,768 keys, 30,408 of them from LwM2M object registries. Only recognized configuration shapes are flattened now — by name, by conventional suffix, and by location (WEB-INF/,META-INF/are spec-defined descriptor directories). ThingsBoard drops to 9,352 keys;daytrader8is byte-identical. (#210) - A
<!DOCTYPE>no longer discards a whole configuration file. The parser refused any DOCTYPE, which threw away 43 files on ThingsBoard — 35 of themlogback.xml, markedextraction=partialwith zero keys while spraying[Fatal Error]at stderr. Configuration files now parse with an internal subset permitted and every external route still closed: external general and parameter entities, external DTD loading and XInclude all remain off, and entity expansion stays capped. Manifests keep the categorical refusal — apom.xmlhas no legitimate reason to declare a DOCTYPE. - Release notes no longer advertise
-a 2 --emit neo4j, which exits 1 (the graph is always projected at full depth and rejects--analysis-level), and the changelog no longer renders empty when pull requests carry no labels.
Changed — read this if you query the Neo4j graph
_moduleis no longer emitted on any node. It was internal by convention (leading underscore) and existed only to tell the writer which module a node belonged to — something the graph never needed to be told, because a node's owning module is already the prefix of itscan://id. No version number signals this: the graph contract is deliberately held at2.0.0, since it is shared across analyzers and moves only when all of them re-baseline together. If you query_module, that is the change to make.- Nodes keyed by a
can://id now carry a:JCanNodemarker, with an index onid. It exists only so a prefix predicate can seek — Neo4j property indexes are label-scoped. It makes no semantic claim, unlike:JSymbol. - The incremental push no longer purges legacy
--schema v1graphs. Those ids are FQN-shaped and carry no application segment, so there is no safe way to scope a delete; a v1 push now upserts and says it skipped.
Verified for this release
daytrader8: schema conformance valid at every level, repeated runs byte-identical, --emit neo4j clean. ThingsBoard v4.0 (4131 files): --emit neo4j completes where 3.0.0 exited 1 and wrote nothing.
📦 Other Changes
- fix(neo4j): stream the Cypher snapshot instead of building it as one String
- PR: #211
- fix(artifacts): flatten only configuration XML, not every XML in the repository
- PR: #212
- fix(neo4j): anchor the Bolt purge on java-owned labels
- PR: #216
- fix(neo4j)!: scope the v2 purge on the can:// id prefix; retire _module from v2
- PR: #220
- fix(neo4j): hold the graph contract at the shared 2.0.0 baseline
- PR: #221
v3.0.0
Install
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v3.0.0/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
# JSON symbol table + call graph + dataflow, at the level you ask for
java -jar codeanalyzer.jar -i /path/to/project -a 4 -o ./out # writes out/analysis.json
# Neo4j projection — always full depth, so it takes no --analysis-level
java -jar codeanalyzer.jar -i /path/to/project --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) — contract version 2.2.0 |
What's changed in 3.0.0
Changed
- BREAKING — canonical schema v2 is now the default output. Pass
--schema v1for the previous shape. (#201) - BREAKING —
--emit neo4jalways projects at full depth and rejects--analysis-level; the graph is no longer level-truncated. - Neo4j graph contract is now 2.2.0, carrying the L4 and artifact overlays. Read it from the release's
schema.neo4j.json.
Added
- Level 4 — interprocedural SDG.
param_in/param_outedges, semantic (points-to) DDG provenance alongside SSA, and per-callablesummaryshortcut edges. Run with-a 4. (#203) - Repository-artifact layer. Build artifacts, declared dependencies, and configuration keys, projected to the cross-language
Artifact/Package/ConfigKeylabels so sibling analyzers merge onto the same nodes. (#206) - L3 dataflow seeds from
@entry's formals, making seeding semantic rather than textual — which is what lets the summary pass compose. (#205)
Fixed
- The call graph is now reproducible. Entrypoints were collected through a parallel stream over an unordered class hierarchy, so RTA reached a slightly different set on every run: three runs over
daytrader8gave 1876 / 1875 / 1876 edges with the declared/rta provenance split swinging across ~14 edges. Output is now byte-identical run to run. - A relative
-ipath no longer silently yields an empty symbol table, andbuild/resourcesfixtures are no longer analyzed as project code. (#200) - A CLI parameter error now exits non-zero.
- The conformance schema admits L4's compound body-node ids (
<line:col>/actual_in:<i>,<line:col>/actual_out), so an-a 4payload validates against it. (#208)
Verified for this release
Run on the daytrader8 fixture (141 files) at -a 4: monotonic across all four levels (186k scalar facts, none lost or rewritten), byte-identical across repeated runs, and the JSON and Neo4j projections agree exactly on all ten overlay counts.
v2.4.1
Install
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v2.4.1/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
java -jar codeanalyzer.jar -i /path/to/project -a 2 --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
v2.4.0
Install
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codellm-devkit/codeanalyzer-java/releases/download/v2.4.0/codeanalyzer-installer.sh | shOr run the JAR directly (requires Java 11+):
java -jar codeanalyzer.jar -i /path/to/project -a 2 --emit neo4j -o ./out # writes out/graph.cypherDownloads
| Asset | Description |
|---|---|
codeanalyzer.jar |
Self-contained analyzer (run with java -jar) |
codeanalyzer-installer.sh |
Installer that fetches the jar and adds a codeanalyzer launcher |
schema.neo4j.json |
Neo4j graph schema contract (node labels, relationships, DDL) |
🚀 Features
🐛 Fixes
📚 Documentation
🚨 Breaking Changes
v2.3.7
What's Changed
- Add new import schema with path, is_static, and is_wildcard fields by @tylerstennett in #144
- feat: emit per-variable field initializers in field declarations by @tylerstennett in #145
- ci: cross-build macOS x86_64 on Apple Silicon; drop Windows by @rahlk in #147
- ci: make musl toolchain/zlib downloads resilient to musl.cc outages by @rahlk in #148
- ci: fix musl static-PIE link + macOS x86_64 cross-wheel smoke test by @rahlk in #149
- ci: smoke-test musl wheels in Alpine, then publish them by @rahlk in #150
New Contributors
- @tylerstennett made their first contribution in #144
Full Changelog: v2.3.6...v2.3.7