This document discusses module repositories in Ceylon, including:
- Modules are now a fundamental part of the language design in Ceylon
- The Ceylon Module Repository (CMR) is used by the typechecker and runtime to locate dependent modules
- Modules are compiled to a local repository and can then be shared globally using repositories like the Herd module repository
- Maven repositories can be used but sometimes have invalid metadata that requires workarounds
- The CMR, runtime, and other Ceylon components are implemented as modules themselves.
2. Modules?
• History
•
•
•
Java SDK monolith
JSR-277, JSR-294, …
OSGi
!
• Should be part of the language!
•
Well, you cannot ignore legacy
•
A ton of cool Java libs, …
!
• It’s all about modules in Ceylon!
•
(at least that’s what Stéphane tells me ;-)
3. Compiling the app?
•
Something needs to know how to *find* dependent modules
•
•
•
Typechecker “talks” to Ceylon Module Repository (CMR)
!
Once an app module is compiled, it goes into local module
repo → *ready* to be used by other modules
!
But how do we share it “globally”?
4. Running the app?
•
Directly — MyApp::main(String… args) ?
•
•
BOOM!! … as nobody knows how to *load* dependent modules
!
Custom “Runtime”
•
•
•
JBoss Modules based (WildFly AS proven; p2p classloading)
“Talks” to CMR to lookup modules
Lazy initialisation; build minimal transient closure of dependency info
5. More module lookups
•
• Sources, module list view and compiling
JavaScript backend
•
IDE
•
Lookup .js files
6. Module lookup
• <name,version> → module or <null>
• No range lookup
• Set of repositories
•
•
Local
Remote
•
•
•
•
File system
Maven
WebDav
Herd
•
Transferring module’ bytecode bits and *dependency info*
• Type of repository
• Remote → Local
7. Dependency info
•
• import org.acme.poke “1.0”
Maven
•
• From pom.xml / via Aether
• JBoss Modules
• module.xml
Custom jar
•
• module.properties
• OSGi (wip)
Native
8. Maven trouble?
•
Some Maven pom.xml files are “invalid”
•
•
Transitive dependencies / flat classpath
2nd level dep used directly
!
• Fix?
•
•
•
•
•
Current workaround = overrides.xml
Add
Remove
Replace
Any better idea?
11. Misc
•
• Can be used in the app; but not encouraged
Language and JDK are added by default
•
• Yes, even JDK is a module (actually multiple modules)
Logging module(s) have special treatment
•
• So all logs end-up at the same place — JBoss LogManager
CMR is pluggable — RepositoryBuilder
•
CMR, Runtime, Typechecker, … are also all modules
•
Impl your own Repository