The graph-based approach to architectural enforcement is way more powerful than traditional static analysis. What I really like is how you've made architecture violations objectively detectable rather than subjectively debatable. The Cypher queries for layering constraints are clean too, though I wonder how this scales when you hit polyglot codebases where some boundries cross JVM languages. Definetly trying this on a legacy system where "layers" are more aspirational than actual.
thanks a lot for the great write‑up—this was super helpful to get started with jQAssistant in a Quarkus app! 🙌
While applying the tutorial, I ran into two small issues (tested with your Quarkus/jQAssistant version):
1. Annotation check path
The annotation match needs the intermediate node between ANNOTATED_BY and the annotation Type. Using OF_TYPE fixed it for me:
MATCH (s)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(ann:Type)
Without [:OF_TYPE], the pattern won’t reach the annotation’s Type node.
2. Dependency constraint
In the “... must not depend on …” rule, I needed one extra guard to avoid a false positive on the synthetic void type:
AND d.fqn <> 'void'
If this was on purpose (e.g., simplified for the tutorial), please disregard; otherwise, hopefully this helps someone using the code base - it definitely helped me.
Thanks again for sharing your knowledge and for all your work in the Quarkus community! 🚀
Thank you soo much! yes, I am usually simplifying (or at least trying to) a little in the tutorials to keep them manageable. Appreciate your addition! Thanks for reading!
The graph-based approach to architectural enforcement is way more powerful than traditional static analysis. What I really like is how you've made architecture violations objectively detectable rather than subjectively debatable. The Cypher queries for layering constraints are clean too, though I wonder how this scales when you hit polyglot codebases where some boundries cross JVM languages. Definetly trying this on a legacy system where "layers" are more aspirational than actual.
Hi Markus,
thanks a lot for the great write‑up—this was super helpful to get started with jQAssistant in a Quarkus app! 🙌
While applying the tutorial, I ran into two small issues (tested with your Quarkus/jQAssistant version):
1. Annotation check path
The annotation match needs the intermediate node between ANNOTATED_BY and the annotation Type. Using OF_TYPE fixed it for me:
MATCH (s)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(ann:Type)
Without [:OF_TYPE], the pattern won’t reach the annotation’s Type node.
2. Dependency constraint
In the “... must not depend on …” rule, I needed one extra guard to avoid a false positive on the synthetic void type:
AND d.fqn <> 'void'
If this was on purpose (e.g., simplified for the tutorial), please disregard; otherwise, hopefully this helps someone using the code base - it definitely helped me.
Thanks again for sharing your knowledge and for all your work in the Quarkus community! 🚀
Thank you soo much! yes, I am usually simplifying (or at least trying to) a little in the tutorials to keep them manageable. Appreciate your addition! Thanks for reading!