Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EclipseCon Europe 2018: Spring Tools 4 - A Look...

EclipseCon Europe 2018: Spring Tools 4 - A Look Behind the Scenes

Martin Lippert

October 23, 2018
Tweet

More Decks by Martin Lippert

Other Decks in Programming

Transcript

  1. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Our Mission Support Spring developers around the globe writing modern Spring applications 2
  2. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Our Journey Spring IDE was invented • back in 2005 • in a time where everybody used Spring with XML • where Eclipse was THE best and market-dominating IDE on the planet Spring IDE (and the Spring Tool Suite) were enhanced and improved a lot over time • but it is time to take a fresh look 3
  3. Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Tools 4 - now GA 4 https://spring.io/tools Spring Tools 4 for Eclipse Spring Tools 4 for Visual Studio Code Spring Tools 4 for Atom IDE
  4. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Behind the Scenes
  5. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Overall design decisions • focus on Spring Boot (focus on key pieces, don’t start with everything at once) • re-imagine developer tooling for Spring (what do we really need?) • start from scratch • do not focus on one specific IDE • performance is key • lightweight beats heavyweight • forget about validations 6
  6. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ What is our focus? • developers choose a variety of developer tools nowadays • focus on the key elements (Spring Boot), not specific IDE internals • implement the tooling in an IDE-agnostic way • => Language Server Protocol • implement as much as possible within the language server • avoid changes to the protocol wherever possible 7
  7. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Developer tooling for Spring Boot • Spring Boot application development is mostly based on • regular (Java) source code • (Java) annotations • Java IDEs already provide great tooling for that • What else do you need? 8
  8. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Looking at your app from the Spring PoV • what are the key elements of your application? • all request mappings? • all bean definitions? • specific bean definitions? • How does the application behave at runtime? • what is being wired and why? • what about conditions? • what about available request mappings? 9
  9. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring-specific overview • generate Spring-specific symbols for everything • analyze source code • be as smart as possible • LSP: • provide symbols via LSP symbol infrastructure • super easy navigation • super easy overviews 10
  10. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Demo
  11. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Internals • Use JDTs ASTParser to parse all the source code • Resolve type bindings where necessary • Visit all generated AST nodes • analyze the code • find Spring elements • extract the symbols • forget the AST 12
  12. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Parsing Java private void scanFiles(IJavaProject project, ASTParser parser, String[] javaFiles, String[] classpathEntries) throws Exception { Map<String, String> options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_10, options); ASTParser parser = ASTParser.newParser(AST.JLS10); parser.setCompilerOptions(options); parser.setKind(ASTParser.K_COMPILATION_UNIT); parser.setStatementsRecovery(true); parser.setBindingsRecovery(true); parser.setResolveBindings(true); parser.setIgnoreMethodBodies(false); String[] sourceEntries = new String[0]; parser.setEnvironment(classpathEntries, sourceEntries, null, false); FileASTRequestor requestor = new FileASTRequestor() { @Override public void acceptAST(String sourceFilePath, CompilationUnit cu) { ... } }; parser.createASTs(javaFiles, null, new String[0], requestor, null); } 13
  13. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Runtime information • show what happens in a running Spring boot application • what beans are being created? • how are they wired together? • what happens at runtime and why? • show live information directly in the source code at the right position • LSP: • use hover to show all the details • use code lenses to show quick links and summaries 14
  14. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Demo
  15. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Internals • Lookup all running Spring Boot apps on your machine (com.sun.tools.attach.*) • Extract Spring actuator data via JMX • Parse source code for open editors (cached ASTs) • Match actuator data against AST • For remote apps: • no automatic discovery (manual JMX connection config necessary) • everything else works just fine • good for identifying performance bottlenecks 16
  16. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Forget about validations • Spring applications are more and more dynamic (e.g. @Conditional…) • you can’t predict exactly what happens at runtime from looking at the source • false warnings are super annoying for developers • => no validations at source-code level anymore • Instead: clear distinction between source code and runtime information • symbol navigation based on source code analysis • live wiring info (e.g.) based on running application 17
  17. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Performance is key • do not block the UI -> great LSP benefit • source code analysis is done in the background (in the language server) • respond to LSP requests as fast as possible (even with partial results) • optimize performance all along the way 18
  18. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Understanding Java projects • Spring Boot applications are (usually) Java projects • to analyze source code, you need to understand the project context (classpath resolution) • first attempt: • understand the project structure on our own (use Gradle, Maven, etc.) • => slow, error-prone, could result in mismatches with Java language tooling • second attempt: • ask the Java tooling (Java language server) for resolved projects and updates 19
  19. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Internals • classpath lookup mechanism • extension for jdt.ls (as regular OSGi bundle to handle commands) • specific commands (to register and receive notifications) • client-side work needed to forward commands • => hard to debug • => depends on existence of jdt.ls in your install • => but saves a lot of resources (again, focus on the key elements) 20
  20. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Outlook
  21. Unless otherwise indicated, these slides are © 2013-2018 Pivotal Software,

    Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Outlook • live hovers - just the beginning • providing more and more runtime information directly in the source code • eat your own dog food • language servers implemented as Spring Boot apps • keeping it small is a challenge • performance improvements • ship updates of language servers independent of the surrounding IDE 22