рдмрд┐рдирд╛ рджрд░реНрдж рдХреЗ рдЬрд╛рд╡рд╛ рдкреНрд▓рдЧ-рдЗрди

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╛рдардХ рд╢рд╛рдпрдж рддреБрд░рдВрдд рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдЖрдк рдмрд╕ рддреИрдпрд╛рд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рд╡рд░реНрдЧ рд▓реЛрдбрд░ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА:

  • рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рдЪреМрдЦрдЯреЗ ( OSGi , Guice, рдЖрджрд┐) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • рд╣рдо ASM рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯрдХреЛрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
  • рд╣рдо рдЕрдкрдирд╛ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
  • рд╣рдо рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
  • рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рдкрд╛рде рдХреЗ рд╕рд╛рде рдЙрдкрджреНрд░рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдХреНрд▓рд╛рд╕рдкрд╛рде рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗред
  • рд╕рд╛рде рд╣реА, рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБрдУрдВ (рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XML, YAML рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдШреЛрд╖рдгрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ 9 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
рдЖрдкрдХреЛ рдПрдХ рдиреНрдпреВрдирддрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ plugins рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

рдпрд╣реА рд╣реИ, рдЗрдХрдЯреНрдареЗ рдЖрд╡реЗрджрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 plugin-app/ plugins/ plugin1.jar plugin2.jar ... core.jar тАж 

core рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдврд╛рдВрдЪрд╛ рд╣реИред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдордп рдХреЛ рдорд╣рддреНрд╡ рджреЗрддреЗ рд╣реИрдВ, рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢
рд▓рд┐рдВрдХ

 git clone https://github.com/orionll/plugin-app cd plugin-app mvn verify cd core/target java --module-path core-1.0-SNAPSHOT.jar --module core 

рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 4 рдЬрд╛рд╡рд╛ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ:

 core/ src/main/java/ org/example/pluginapp/core/ IService.java BasicService.java Main.java module-info.java 

рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓, IService.java рд╡рд╣ рдлрд╛рдЗрд▓ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рддрдм рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ ("рдпреЛрдЧрджрд╛рди") рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдпрд╣ рдкреНрд▓рдЧ-рдЗрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд (рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдирд╡рд░реНрд╕рди) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ред

рдореИрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рдХреЛ рд╕рд╛рд░ рдирд╛рдо IService , рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдм рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрдкрд╛рджрдХ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IEffectProvider , IEffectContribution рдпрд╛ рдХреБрдЫ рдФрд░, рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдирд╛рдо рджреЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрд╡рдпрдВ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдкреНрд░рднрд╛рд╡ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ plugins рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

IService.java рдлрд╝рд╛рдЗрд▓ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 тАж public interface IService { void doJob(); static List<IService> getServices(ModuleLayer layer) { return ServiceLoader .load(layer, IService.class) .stream() .map(Provider::get) .collect(Collectors.toList()); } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, IService рд╕рд┐рд░реНрдл рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдХреБрдЫ рд╕рд╛рд░ doJob() (рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рд╡рд┐рд╡рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреБрдЫ рдареЛрд╕ рд╣реЛрдЧрд╛)ред

рджреВрд╕рд░реЗ getServices() рдкрджреНрдзрддрд┐ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╡рд┐рдзрд┐ IService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдкрд░рдд рдФрд░ рдЗрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рдорд┐рд▓реА рдереАред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓, BasicService.java , IService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЖрдзрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЛрдИ рдкреНрд▓рдЧрдЗрдиреНрд╕ рди рд╣реЛрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, core рди рдХреЗрд╡рд▓ рдХреЛрд░ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рднреА рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд▓реЛрдб рд╣реЛрдЧрд╛ред BasicService.java рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 тАж public class BasicService implements IService { @Override public void doJob() { System.out.println("Basic service"); } } 

рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, doJob() рдХреЗрд╡рд▓ "Basic service" рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рд╣реИ:



рддреАрд╕рд░реА рдлрд╝рд╛рдЗрд▓, Main.java , рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдБ main() рдкрджреНрдзрддрд┐ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИред рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬрд╛рджреВ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдкрд░рдд рдХреНрдпрд╛ рд╣реИред

рдореЙрдбреНрдпреВрд▓ рдкрд░рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдЬрдм рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЙрдбреНрдпреВрд▓ + рдореЙрдбреНрдпреВрд▓ --module-path рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ --module-path (рдФрд░ рднреА classpath , рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рддрдерд╛рдХрдерд┐рдд Boot рд▓реЗрдпрд░ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рд╣рдо core.jar рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ java --module-path core.jar --module core , рддреЛ Boot рдкрд░рдд рдореЗрдВ рдХрдо рд╕реЗ рдХрдо java.base рдФрд░ core рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреЗ:



Boot рдкрд░рдд рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рдВрднрд╡ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рдПрдХрд▓ рдкрд░рдд рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо plugins рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рд▓рд╛рдЗрди рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣ рд╕реНрд╡рдпрдВ рдЖрд╡рд╢реНрдпрдХ рдкреНрд▓рдЧ --module-path рдЗрди --module-path рдХреЛ --module-path , рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЗ рд▓реЛрдЧ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрддрдиреА рд╕рд░рд▓ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдФрд░ рдЪрдврд╝рдиреЗ рдФрд░ рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдЬрд╛рд╡рд╛ рдЖрдкрдХреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рдореЙрдбреНрдпреВрд▓ рдкрд░рддреЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЙрд╕ рдЬрдЧрд╣ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдкрд░рдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ Boot рдкрд░рдд рд╣реЛрдЧреА (рдХрд┐рд╕реА рднреА рдкрд░рдд рдореЗрдВ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП):



рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдкрд░рдд рдореЗрдВ Boot рдкрд░рдд рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдкрд░рдд рд╕реЗ рдореЙрдбреНрдпреВрд▓ Boot рдкрд░рдд рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВред

рдЗрд╕рд▓рд┐рдП, рдЕрдм рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓реЗрдпрд░ рдХреНрдпрд╛ рд╣реИ, рдЖрдк рдЕрдВрддрддрдГ Main.java рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 тАж public final class Main { public static void main(String[] args) { Path pluginsDir = Paths.get("plugins"); //      plugins ModuleFinder pluginsFinder = ModuleFinder.of(pluginsDir); //  ModuleFinder      plugins       List<String> plugins = pluginsFinder .findAll() .stream() .map(ModuleReference::descriptor) .map(ModuleDescriptor::name) .collect(Collectors.toList()); //  ,      (   ) Configuration pluginsConfiguration = ModuleLayer .boot() .configuration() .resolve(pluginsFinder, ModuleFinder.of(), plugins); //      ModuleLayer layer = ModuleLayer .boot() .defineModulesWithOneLoader(pluginsConfiguration, ClassLoader.getSystemClassLoader()); //     IService       Boot List<IService> services = IService.getServices(layer); for (IService service : services) { service.doJob(); } } } 

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдП рдЕрдЬреНрдЮрд╛рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдПрдХ рдЧрд▓рдд рд╕рдирд╕рдиреА рд╣реИред рдпрджрд┐ рдЖрдк ModuleFinder , рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ ModuleLayer рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрддреЗ рд╣реИрдВ , рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗрд╡рд▓ рдХреБрдЫ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ! рдпрд╣ рд╕рднреА рддрд░реНрдХ рд╣реИрдВ рдЬреЛ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред

рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╡рд░рдгрдХ


рдПрдХ рдФрд░ (рдЪреМрдереА) рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдирд╣реАрдВ рдорд╛рдирд╛: module-info.java ред рдпрд╣ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг (рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 тАж module core { exports org.example.pluginapp.core; uses IService; provides IService with BasicService; } 

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЙрдбреНрдпреВрд▓ org.example.pluginapp.core рдкреИрдХреЗрдЬ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, org.example.pluginapp.core рдкреНрд▓рдЧ рдЗрди IService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗ (рдЕрдиреНрдпрдерд╛ IService core рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред
  • рджреВрд╕рд░реЗ, рд╡рд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ IService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
  • рддреАрд╕рд░рд╛, рд╡рд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ BasicService рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ IService рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдШреЛрд╖рдгрд╛ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ: рд╕рдВрдХрд▓рдХ рдЬрд╛рдВрдЪ рдФрд░ рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдо рдкрд░ рдХреЛрдИ рдЧрд▓рддреА рдХреА рд╣реИ рдпрд╛ рдХрд┐рд╕реА рднреА рдкреИрдХреЗрдЬ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рддреБрд░рдВрдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрдВрдЧреЗред рдХреБрдЫ OSGi рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХреЛрдИ рдЪреЗрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХреНрд╕рдПрдордПрд▓ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рддреЛ, рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

 > java --module-path core.jar --module core Basic service 

рдХреНрдпрд╛ рд╣реБрдЖ?

  1. рдЬрд╛рд╡рд╛ рдиреЗ plugins рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдХреЛрдИ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред
  2. рдПрдХ рдЦрд╛рд▓реА рдкрд░рдд рдмрдирд╛рдИ рдЧрдИ рдереАред
  3. ServiceLoader рдиреЗ рд╕рднреА IService рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рд╢реБрд░реВ рдХреАред
  4. рдЦрд╛рд▓реА рдкрд░рдд рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдВ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИрдВред
  5. рдЗрд╕ рдкрд░рдд рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореВрд▓ рдкрд░рдд (рдпрд╛рдиреА, Boot рдкрд░рдд) рдореЗрдВ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦреА рдФрд░ core рдореЙрдбреНрдпреВрд▓ рдореЗрдВ BasicService рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдпрд╛ред
  6. рд╕рднреА рдкрд╛рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ doJob() рдкрджреНрдзрддрд┐ рдереАред рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ "Basic service" рдореБрджреНрд░рд┐рдд рдХреА рдЧрдИ рдереАред

рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓реЗрдЦрди


рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪрд▓реЛ рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ plugin1 рдФрд░ plugin2 : рдкрд╣рд▓рд╛ рдкреНрд░рд┐рдВрдЯ "Service 1" , рджреВрд╕рд░рд╛ - "Service 2" ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреНрд░рдорд╢рдГ plugin1 рдФрд░ plugin2 рдореЗрдВ plugin1 рдФрд░ plugin2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓рд╛ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдПрдБ:

 plugin1/ src/main/java/ org/example/pluginapp/plugin1/ Service1.java module-info.java 

Service1.java рдлрд╝рд╛рдЗрд▓:

 тАж public class Service1 implements IService { @Override public void doJob() { System.out.println("Service 1"); } } 

module-info.java рдлрд╝рд╛рдЗрд▓:

 тАж module plugin1 { requires core; provides IService with Service1; } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ plugin1 core рдирд┐рд░реНрднрд░ рд╣реИред рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ: рдХрд░реНрдиреЗрд▓ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рджреВрд╕рд░рд╛ рдкреНрд▓рдЧрдЗрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред

рдЕрдм рд╣рдо рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ plugins рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

 > java --module-path core.jar --module core Service 1 Service 2 Basic service 

рд╣реБрд░реНрд░реЗ, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЙрдард╛рдП рдЧрдП рдереЗ! рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ:

  1. рдЬрд╛рд╡рд╛ рдХреЛ plugins рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЛ рдореЙрдбреНрдпреВрд▓ рдорд┐рд▓реЗред
  2. рджреЛ рдореЙрдбреНрдпреВрд▓ plugins1 рдФрд░ plugins2 рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рдд рдмрдирд╛рдИ рдЧрдИ рдереАред
  3. ServiceLoader рдиреЗ рд╕рднреА IService рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рд╢реБрд░реВ рдХреАред
  4. рдкреНрд▓рдЧрдЗрди рдкрд░рдд рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ IService рд╕реЗрд╡рд╛ рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдПред
  5. рдЙрд╕рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореВрд▓ рдкрд░рдд (рдпрд╛рдиреА, Boot рдкрд░рдд) рдореЗрдВ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦреА рдФрд░ core рдореЙрдбреНрдпреВрд▓ рдореЗрдВ BasicService рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдпрд╛ред
  6. рд╕рднреА рдкрд╛рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ doJob() рдкрджреНрдзрддрд┐ рдереАред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдмрдЪреНрдЪреЗ рдХреА рдкрд░рддреЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдкрд░рддреЛрдВ рддрдХ рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ "Service 1" рдФрд░ "Service 2" рдкрд╣рд▓реЗ рдореБрджреНрд░рд┐рдд рд╣реЛрддреА "Service 2" , рдФрд░ рдлрд┐рд░ "Basic Service" ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд╕реЗрд╡рд╛рдПрдВ рдкрд╣рд▓реЗ рдЬрд╛рдПрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд▓рдЧрдЗрдиреНрд╕, рддреЛ рдЖрдк рд╡рд╣рд╛рдВ рдЫрдБрдЯрд╛рдИ рдЬреЛрдбрд╝рдХрд░ IService.getServices() рд╡рд┐рдзрд┐ рдХреЛ int getOrdering() рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ int getOrdering() рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ int getOrdering() рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

рдкрд░рд┐рдгрд╛рдо


рддреЛ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкреНрд▓рдЧ-рдЗрди рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реИрдВ:

  • рд╕рд╛рджрдЧреА: рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЙрдирдХреЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдореВрд▓ рдЬрд╛рд╡рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ (рдЗрдВрдЯрд░рдлреЗрд╕, рдХрдХреНрд╖рд╛рдПрдВ, рдФрд░ ServiceLoader ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлреНрд░реЗрдорд╡рд░реНрдХ, рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЗ рдмрд┐рдирд╛ред
  • рдШреЛрд╖рдгрд╛: рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рд╡рд░рдг рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдмрд╕ module-info.java рдХреЛ module-info.java рдФрд░ рд╕рдордЭреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рдЗрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреМрди рд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпреЛрдЧрджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
  • рд╕реНрдЯреЗрдЯрд┐рдХ рдЧрд╛рд░рдВрдЯреА: рдореЙрдбреНрдпреВрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк IntelliJ IDEA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓реЗрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ ServiceLoader.load() рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)
  • рд╕реБрд░рдХреНрд╖рд╛: рдореЙрдбреНрдпреВрд▓рд░ рдЬрд╛рд╡рд╛ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╣реА рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╡рд┐рдЪрд╛рд░ рджрд┐рдЦрд╛рдпрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд▓рдЧ-рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рджрд╕рд┐рдпреЛрдВ рд╕реЗ рд╕реИрдХрдбрд╝реЛрдВ рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рд╕реЗ рд╣рдЬрд╛рд░реЛрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЙрдЗрдВрдЯ рд╣реЛрдВрдЧреЗред

рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЙрдард╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ 7 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореИрдВ рдПрдХ рдЧреНрд░рд╣рдг рдЖрд░рд╕реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЦреНрдпрд╛рдд рдУрдПрд╕рдЬреАрдЖрдИ рдХреЛ рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд▓рдЧ-рдЗрди рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдХреЛ рдПрдХреНрд╕рдПрдордПрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реМ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ рдФрд░ рд╣рдо рдЕрднреА рднреА рдЬрд╛рд╡рд╛ 8 рдкрд░ рдмреИрдареЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЬрд╛рд╡рд╛ рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рд╣рдо рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдУрдПрд╕рдЬреАрдЖрдИ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрдВрдзреЗ рд╣реБрдП рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкреНрд▓рдЧ-рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИрдВ, рд▓рдХреНрд╖реНрдп рдирд╣реАрдВред

рдореЗрд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ


рдореИрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрд╖реЛрдВ (рдЬрд╛рд╡рд╛ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ 8) рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдЕрдкрдирд╛ рдЪреИрдирд▓ рдЬрд╛рд╡рд╛ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/hi479478/


All Articles