рдЬрд╛рд╡рд╛ рдореВрд▓ рдЫрд╡рд┐: рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ



рдЗрддрдирд╛ рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, Oracle рдиреЗ GraalVM рдкреНрд░реЛрдЬреЗрдХреНрдЯ (https://www.graalvm.org/) рдХреА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬрд╝ рдЬрд╛рд░реА рдХреАред рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рддреБрд░рдВрдд рдирдВрдмрд░ 19.0.0 рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░рд┐рдкрдХреНрд╡ рд╣реИ рдФрд░ рдЧрдВрднреАрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ: рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдПрдХ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рджреЗрд╢реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ (рд╕рд╛рде рд╣реА рд╕рд╛рде рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд▓рд┐рдЦрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА / рд╕реА ++ рдореЗрдВ)ред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрдм рддрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореВрд▓ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ: рдЖрдкрдХреЛ рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЕрдиреНрдп рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рдореВрд▓ рдЫрд╡рд┐ рдЬрд╛рд╡рд╛ рд╕реАрдорд╛ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд╣реИред рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдЗрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдирд░рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдпрд╣ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ (рдУрдЖрд░рдПрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореВрд▓ рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд┐рдирд╛ рдЬрд╛рд╡рд╛ рдорд╢реАрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ Ubuntu 19.04 (Intel Core i3-6100 CPU @ 3.70GHz ├Ч 4) рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

GraalVM рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


GraalVM рдХреА рд╕реНрдерд╛рдкрдирд╛ рдПрд╕рдбреАрдХреЗрдореИрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ ред GraalVM рд╕реНрдерд╛рдкрдирд╛ рдЖрджреЗрд╢:

sdk install java 19.0.0-grl 

OpenJDK GraalVM CE 19.0.0 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, CE рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдПрдбрд┐рд╢рди (EE) рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдУрд░реЗрдХрд▓ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд▓рд┐рдВрдХ GraalVM рдбрд╛рдЙрдирд▓реЛрдб рдкреЗрдЬ рдкрд░ рд╣реИред

GraalVM рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GraalVM рд╕реЗ gu рдШрдЯрдХ рдЕрджреНрдпрддрди рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдорд░реНрдерди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ -

 gu install native-image 

рд╕рдм рдХреБрдЫ, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрдкрдХрд░рдг рддреИрдпрд╛рд░ рд╣реИрдВ, рдЕрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд░рд▓ рджреЗрд╢реА рдЖрд╡реЗрджрди


рдПрдХ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рджреЗрд╢реА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рд╡реЗрди рдкреНрд▓рдЧрдЗрди рд╣реИ:

рджреЗрд╢реА рдЫрд╡рд┐ maven-рдкреНрд▓рдЧрдЗрди
 <build> <plugins> <plugin> <groupId>com.oracle.substratevm</groupId> <artifactId>native-image-maven-plugin</artifactId> <version>${graal.version}</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <phase>package</phase> </execution> </executions> <configuration> <imageName>nativej</imageName> <buildArgs> --no-server </buildArgs> </configuration> </plugin> </plugins> </build> 


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

Maven-рдЬрд╛рд░-рдкреНрд▓рдЧрдЗрди
 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <mainClass>nativej.Startup</mainClass> </manifest> </archive> </configuration> </plugin> 


рдореБрдЦреНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:

Startup.java
 public class Startup { public static void main(String[] args) { System.out.println("Hello world!"); } } 


рдЕрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд╡реЗрди рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 mvn clean package 

рдореЗрд░реА рдорд╢реАрди рдкрд░ рдПрдХ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ 35 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ 2.5 рдПрдордмреА рдЖрдХрд╛рд░ рдХреА рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдЬрд╛рд╡рд╛ рдорд╢реАрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрди рдорд╢реАрдиреЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд╛рд╡рд╛ рдЧрд╛рдпрдм рд╣реИред

рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд▓рд┐рдВрдХ: рдЬреАрдердм: рджреЗрд╢реА-рдЬрд╛рд╡рд╛-рд╣реЗрд▓реЛрд╡рд░реНрд▓реНрдб-рдбреЗрдореЛ ред

JDBC рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдкрджрд╕реНрдерд╛рдкрди рдХрд░рддрд╛ рд╣реИ


рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереАред рдореИрдВ рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛: рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдЧреНрд░реИрдбреНрд╕ JDBC рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдЬреБрдбрд╝реВрдВрдЧрд╛ред GraalVM github рдХреЗ рдореБрджреНрджреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди GraalVM рдкрд░ рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдЙрди рд╕рднреА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрд╡рд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

 <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.5</version> </dependency> 

рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ (рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд▓реЗрдЯ рдмрдирд╛рдИ рдЧрдИ рдереА):

Startup.java
 public class Startup { public static void main(String[] args) SQLException { final PGSimpleDataSource ds = new PGSimpleDataSource(); ds.setUrl("jdbc:postgresql://localhost/demo_nativem"); ds.setUser("test"); ds.setPassword("test"); try ( Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM \"public\".\"user\""); ) { while(rs.next()){ System.out.print("ID: " + rs.getLong("id")); System.out.println(", Name: " + rs.getString("name")); } } } } 


рдореИрдВ рдореВрд▓ рдмрд╛рдЗрдирд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рддреБрд░рдВрдд рдПрдХ рдмрд┐рд▓реНрдб рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:

Error: No instances are allowed in the image heap for a class that is initialized or reinitialized at image runtime: org.postgresql.Driver. Try marking this class for build-time initialization with --initialize-at-build-time=org.postgresql.Driver


рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдбрд░ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╕рднреА рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рд╣реЛ), рдФрд░ рд╡рд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рдХреЛрдб org.postgresql.Driver рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИ (рдЬрдм рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдпрд╛ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдФрд░ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдореВрд▓-рдЫрд╡рд┐-рдорд╛рд╡реЗрди-рдкреНрд▓рдЧрдЗрди рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╡рди рддрд░реНрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╡рд┐рд╡рд░рдг рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред Driver рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ org.postgresql.util.SaringTimer рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдлрд┐рд░, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд┐рд▓реНрдб рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрдХрдЯреНрдард╛ рдФрд░ рдореБрдарднреЗрдбрд╝ рдХрд░рддрд╛ рд╣реВрдВ:

Error: Class initialization failed: org.postgresql.sspi.SSPIClient


рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдХрдХреНрд╖рд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд▓рд┐рдирдХреНрд╕ рдкрд░, рдЗрд╕рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг (рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ) рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЖрд╡реЗрджрди рдХреЗ рд╢реБрд░реВ рдореЗрдВ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИ: - Ininitialize-at-run-time = org.postgresql.sspi.SSPIClientред рд▓рд┐рдирдХреНрд╕ рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреАред рдирд┐рд░реНрдорд╛рдг рддрд░реНрдХ:

 <buildArgs> --no-server --no-fallback --initialize-at-build-time=org.postgresql.Driver --initialize-at-build-time=org.postgresql.util.SharedTimer --initialize-at-run-time=org.postgresql.sspi.SSPIClient </buildArgs> 

рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ 1 рдорд┐рдирдЯ 20 рд╕реЗрдХрдВрдб рд▓рдЧрдиреЗ рд▓рдЧреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ 11 MB рддрдХ рд╕реНрд╡рд╛рд╣ рд╣реЛ рдЧрдИред рдореИрдВрдиреЗ рдмрд╛рдЗрдирд░реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрд╡рдЬ рдЬреЛрдбрд╝рд╛: -рдХреЛрдИ-рдлреЙрд▓рдмреИрдХ рдирд┐рд╖рд┐рджреНрдз рдПрдХ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдЬрд╛рд╡рд╛ рдорд╢реАрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдмрд╛рдЗрдирд░реА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдХрд▓реЗрдХреНрдЯрд░ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХреЛрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд▓реЗрдХреНрдЯрд░ рдиреЗ рдЬреЗрдбреАрдмреАрд╕реА рдЪрд╛рд▓рдХ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рдХреА рдЦреЛрдЬ рдХреАред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИ, рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рд╡рд╣рд╛рдБ рднреА - thestatic рдЭрдВрдбрд╛ рд╣реИ, рдЬреЛ рдЬрдирдХ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ libc рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рдЖрдИрдкреА рдкрддреЗ рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдирд╛рдо рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдкрд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред

рдореИрдВ рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:

Exception in thread "main" org.postgresql.util.PSQLException: Could not find a java cryptographic algorithm: TLS SSLContext not available.


рдХреБрдЫ рд╢реЛрдз рдХреЗ рдмрд╛рдж, рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЧрдИ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЯреНрд╕ рдПрд▓рд┐рдкреНрдЯрд┐рдХ рдХрд░реНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЯреАрдПрд▓рдПрд╕ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реНрдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдореЗрдВ рдЯреАрдПрд▓рдПрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рд╕рдВрдЧрдд рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ - рд╕рдмрд╕реНрдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдмрд╛рдЗрдирд░реА рдИрд╕реАрд╕реА (рдИрд╕реАрдбреАрдПрд╕рдП / рдИрд╕реАрдбреАрдПрдЪрдИ) рдЯреАрдПрд▓рдПрд╕ рд╕рдорд░реНрдерди ред рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ: рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ GraalVM рдкреИрдХреЗрдЬ рд╕реЗ рдбрд╛рд▓реЗрдВ: libsunec.so рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рд░реНрд╡рд░ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╕реВрдЪреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдПрд▓рд┐рдкреНрдЯрд┐рдХ рдХрд░реНрд╡ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЗрдВ рдпрд╛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдЯреАрдПрд▓рдПрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ (рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛):

 dataSource.setSslMode(SslMode.DISABLE.value); 

Postgres рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд▓рд┐рдВрдХ: рдЬреАрдердм: рджреЗрд╢реА-рдЬрд╛рд╡рд╛-рдкреЛрд╕реНрдЯрдЧреНрд░реИрдЬ-рдбреЗрдореЛ ред

рдбрд┐ рдлреНрд░реЗрдо рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рд╡реЗрдм рд╕рд░реНрд╡рд░


рдПрдХ рдЬрдЯрд┐рд▓ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯред рд▓реЗрдХрд┐рди GraalVM рдХреА рдореВрд▓ рдЫрд╡рд┐ рд╕рдорд░реНрдерди рдХреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рджреЗрд╢реА рдЫрд╡рд┐ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрд╛ рдХрд╛рдо рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 5.3 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рдорд╕реЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдПрдХ рдЕрджреНрднреБрдд рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЧреНрд░реЗрд╡рд╛рд▓рдо рджреЗрд╢реА рдЫрд╡рд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдХреЛ рдПрдХ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЬреЛ рдПрдХ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдмрд╕реНрдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдЗрдХреНрд░реЛрдиреЙрдЯ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред рд╡реИрд╕реЗ, рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ META-INF / рджреЗрд╢реА-рдЫрд╡рд┐ / $ {groupId} / $ {рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп} /native-image.properties рдореЗрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╣реА рд╕реЗрдЯрд┐рдВрдЧ рд░рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдкрде рд╕рдмрд╕реНрдЯреНрд░реЗрдЯ VM рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ), рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:

native-image.properties
 Args = \ -H:+ReportUnsupportedElementsAtRuntime \ -H:ResourceConfigurationResources=${.}/resource-config.json \ -H:ReflectionConfigurationResources=${.}/reflect-config.json \ -H:DynamicProxyConfigurationResources=${.}/proxy-config.json \ --initialize-at-build-time=org.postgresql.Driver \ --initialize-at-build-time=org.postgresql.util.SharedTimer \ --initialize-at-run-time=org.postgresql.sspi.SSPIClient 


рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди-config.json, рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд-config.json, рдкреНрд░реЙрдХреНрд╕реА-config.json рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдкреНрд░рдпреБрдХреНрдд рдкреНрд░реЙрдХреНрд╕реА (Proxy.newProxyInstance)ред рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдПрдЬреЗрдВрдЯрд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ: рдореВрд▓-рдЫрд╡рд┐-рдПрдЬреЗрдВрдЯред рджреЗрд╢реА-рдЫрд╡рд┐-рдПрдЬреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдЬреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд░ (рдФрд░ рдореВрд▓ рдмрд╛рдЗрдирд░реА рдирд╣реАрдВ) рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 java -agentlib:native-image-agent=config-output-dir=output -jar my.jar 

рдЬрд╣рд╛рдБ рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдлрд╛рдЗрд▓реЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рди рдХреЗрд╡рд▓ рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдЦреБрд▓реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ META-INF / рджреЗрд╢реА-рдЫрд╡рд┐ / $ {groupId} / $ {рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп} рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ native-image.properties рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд▓реЙрдЧрдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛: рдореИрдВрдиреЗ рд▓реЙрдЧрдмреИрдХ-рдХреНрд▓рд╛рд╕рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд▓реЙрдЧрдмреИрдХ.рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реАред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рджреЗрд╢реА-рдЫрд╡рд┐-рдПрдЬреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛ред рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╛рдЗрд▓реЗрдВред рдпрджрд┐ рдЖрдк рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдЬреЗрдВрдЯ рдиреЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП logback.xml рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддрд┐рдмрд┐рдВрдм-config.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рджрд┐рдП рдЧрдП рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рдЗрдирд░реА рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧреАред

рдлрд┐рд░ рдореИрдВрдиреЗ рдиреЗрдЯреА-рдЖрдзрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбреЗрдб рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдПрдиреЗрдЯ-http-server-netty рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реА рдФрд░ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдпрд╛:

Startup.java
 @Controller("/hello") public class HelloController { @Get("/{name}") @Produces(MediaType.TEXT_PLAIN) public HttpResponse<String> hello(String name) { return HttpResponse.ok("Hello " + name); } } 


рдФрд░ рдореБрдЦреНрдп рд╡рд░реНрдЧ:

HelloController.java
 public class Startup { public static void main(String[] args) { Signal.handle(new Signal("INT"), sig -> System.exit(0)); Micronaut.run(Startup.class, args); } } 


рдЕрдм рдЖрдк рдПрдХ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реА рд╕рднрд╛ рдореЗрдВ 4 рдорд┐рдирдЯ рд▓рдЧреЗред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ http: // localhost: 8080 / рд╣реИрд▓реЛ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:

 {"_links":{"self":{"href":"/hello/user","templated":false}},"message":"More than 1 route matched the incoming request. The following routes matched /hello/user: GET - /hello/user, GET - /hello/user"} 

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рдВрд╕рд╛рдзрди-config.json рдлрд╝рд╛рдЗрд▓ (рдЬреЛ рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдереА) рд╕реЗ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ:

  {"pattern":"META-INF/services/com.fasterxml.jackson.databind.Module"}, {"pattern":"META-INF/services/io.micronaut.context.env.PropertySourceLoader"}, {"pattern":"META-INF/services/io.micronaut.http.HttpResponseFactory"}, {"pattern":"META-INF/services/io.micronaut.inject.BeanConfiguration"}, {"pattern":"META-INF/services/io.micronaut.inject.BeanDefinitionReference"}, 

рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреБрдирдГ рдкрдВрдЬреАрдХрд░рдг рд╕реЗ рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рджреЛрд╣рд░рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдмрд╛рдЗрдирд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдкрд╛рда "рд╣реИрд▓реЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" http: // localhost: 8080 / hello / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

 Signal.handle(new Signal("INT"), sig -> System.exit(0)); 

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

рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд▓рд┐рдВрдХ: рдЬреАрдердм: рджреЗрд╢реА-рдЬрд╛рд╡рд╛-рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ-рдорд╛рдЗрдХреНрд░реЛрдПрд░рди-рдбреЗрдореЛ ред

ORM рдХрдиреЗрдХреНрд╢рди


JDBC рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛрд╣рд░рд╛рд╡ рдХреЛрдб, рдЕрдВрддрд╣реАрди рдЪрдпрди рдФрд░ рдЕрджреНрдпрддрди рдХреЗ рдЯрд╛рдпрд░ред рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ ORM рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЬрд┐рд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реВрдВ) рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред

рд╣рд╛рдЗрдмрд░рдиреЗрдЯ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдУрдЖрд░рдПрдо рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдмрд┐рд▓реНрдб рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореВрд▓ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛:

 Error: Field java.lang.reflect.Method.defaultValue is not present on type java.lang.reflect.Constructor. Error encountered while analysing java.lang.reflect.Method.getDefaultValue() Parsing context: parsing org.hibernate.annotations.common.annotationfactory.AnnotationProxy.getAnnotationValues(AnnotationProxy.java:63) parsing org.hibernate.annotations.common.annotationfactory.AnnotationProxy(AnnotationProxy.java:52) ... 

рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ: [рдореВрд▓-рдЫрд╡рд┐] java.lang.reflect.Method.getDefaultValue () рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди + рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкрд░рд┐рдгрд╛рдо ред

jOOQ


рдлрд┐рд░ рдореИрдВрдиреЗ jOOQ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдПрдХ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд░рдиреА рдереАрдВ: рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХрд┐ рдХреМрди рд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЖрд░рдВрднреАрдХрд░рдг (рдмрд┐рд▓реНрдбрдЯрд╛рдЗрдо, рд░рдирдЯрд╛рдЗрдо) рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдирд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдкрд░ рдЙрддрд░ рдЖрдпрд╛ рдХрд┐ рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ jOOQ рдкреНрд░реЙрдХреНрд╕реА org.jooq.impl.ParserImpl рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ $ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред org.jooq.impl.oolsред рдФрд░ рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдердбрд╛рдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдмреНрд╕рдЯреНрд░реЗрдЯ рд╡реАрдПрдо рдЕрднреА рддрдХ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдПрдХ рдРрд╕рд╛ рд╣реА рдЦреБрд▓рд╛ рдореБрджреНрджрд╛ рд╣реИ: [рдореВрд▓-рдЫрд╡рд┐] рдорд╛рдЗрдХреНрд░реЛрдСрдирдЯ + рдХрд╛рдлреНрдХрд╛, рдореЗрдердбрд▓ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рджреЗрд╢реА рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЙрд▓ рдкрд░ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЕрдкрд╛рдЪреЗ рдХреИрдпреЗрди


рдЕрдкрд╛рдЪреЗ рдХреЗрдпреЗрди рдХрдо рдЖрдо рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИрдВ, рд╡реЗ рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдХреЗрдпреЗрдирдореЙрдбрд▓рд░ рдЬреАрдпреВрдЖрдИ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред Pom рдлрд╝рд╛рдЗрд▓ рдореЗрдВ cayenne-maven-plugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рдиреАрдЪреЗ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

рд▓рд╛рд▓-maven-рдкреНрд▓рдЧрдЗрди
 <plugin> <groupId>org.apache.cayenne.plugins</groupId> <artifactId>cayenne-maven-plugin</artifactId> <version>${cayenne.version}</version> <configuration> <map>src/main/resources/db/datamap.map.xml</map> <destDir>${project.build.directory}/generated-sources/cayenne</destDir> </configuration> <executions> <execution> <goals> <goal>cgen</goal> </goals> </execution> </executions> </plugin> 


рдлрд┐рд░ рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрдн рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрдпреЗрдирд░рдВрдЯрд╛рдЗрдордлреИрдХреНрдЯреА рдХреНрд▓рд╛рд╕ рдХреЛ рдЬреЛрдбрд╝рд╛:

CayenneRuntimeFactory.java
 @Factory public class CayenneRuntimeFactory { private final DataSource dataSource; public CayenneRuntimeFactory(DataSource dataSource) { this.dataSource = dataSource; } @Bean @Singleton public ServerRuntime cayenneRuntime() { return ServerRuntime.builder() .dataSource(dataSource) .addConfig("db/cayenne-test.xml") .build(); } } 


HelloController рдирд┐рдпрдВрддреНрд░рдХ:

HelloController.java
 @Controller("/hello") public class HelloController { private final ServerRuntime cayenneRuntime; public HelloController(ServerRuntime cayenneRuntime) { this.cayenneRuntime = cayenneRuntime; } @Get("/{name}") @Produces(MediaType.TEXT_PLAIN) public HttpResponse<String> hello(String name) { final ObjectContext context = cayenneRuntime.newContext(); final List<User> result = ObjectSelect.query(User.class).select(context); if (result.size() > 0) { result.get(0).setName(name); } context.commitChanges(); return HttpResponse.ok(result.stream() .map(x -> MessageFormat.format("{0}.{1}", x.getObjectId(), x.getName())) .collect(Collectors.joining(","))); } } 


рддрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдХрд┐рдпрд╛, рдПрдЬреЗрдВрдЯрд▓реАрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП: рджреЗрд╢реА-рдЫрд╡рд┐-рдПрдЬреЗрдВрдЯ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдкрд▓рдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдореИрдВрдиреЗ рджреЗрд╢реА рдмрд╛рдЗрдирд░реА рдПрдХрддреНрд░ рдХрд┐рдпрд╛, рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛, рдкрддреЗ рдкрд░ рдЬрд╛рдПрдВ http: // localhost: 8080 / рд╣реИрд▓реЛ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ :

 {"message":"Internal Server Error: Provider com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl not found"} 

рдпрд╣ рдПрдЬреЗрдВрдЯрд▓рд┐рдм рдирд┐рдХрд▓рд╛: рджреЗрд╢реА-рдЫрд╡рд┐-рдПрдЬреЗрдВрдЯ рдиреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ред

рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд-config.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛:

 { "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", "allDeclaredConstructors":true } 

рдлрд┐рд░ рд╕реЗ, рдореИрдВ рдмрд╛рдЗрдирд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗрдм рдкреЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:

 Caused by: java.util.MissingResourceException: Resource bundle not found org.apache.cayenne.cayenne-strings. Register the resource bundle using the option -H:IncludeResourceBundles=org.apache.cayenne.cayenne-strings. 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдореИрдВ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ рдореИрдВ рдмрд╛рдЗрдирд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╣ 5 рдорд┐рдирдЯ рдХрд╛ рд╕рдордп рд╣реИ), рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐, рдПрдХ рдФрд░:

 No DataMap found, can't route query org.apache.cayenne.query.SelectQuery@2af96966[root=class name.voyachek.demos.nativemcp.db.User,name=]"} 

рдореБрдЭреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдкрд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╡рд░реНрдЧ org.apache.cayenne.resource.URLResource рд╕реЗ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реИ:

 return new URLResource(new URL(url, relativePath)); 

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

рддреНрд░реБрдЯрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдм рдЖрдкрдХреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдкрд╛рдЪреЗ рдХреЗрдпреЗрди рдХрд╛рдлреА рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдЪреАрдЬ рдмрди рдЧрдИред рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕рдВрд╕рд╛рдзрди рд▓реЛрдбрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 ServerRuntime.builder() .dataSource(dataSource) .addConfig("db/cayenne-test.xml") .addModule(binder -> { binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocatorFix.class); binder.bind(Key.get(ResourceLocator.class, Constants.SERVER_RESOURCE_LOCATOR)).to(ClassLoaderResourceLocatorFix.class); }) .build(); 

рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:

ClassLoaderResourceLocatorFix.java
 public class ClassLoaderResourceLocatorFix implements ResourceLocator { private ClassLoaderManager classLoaderManager; public ClassLoaderResourceLocatorFix(@Inject ClassLoaderManager classLoaderManager) { this.classLoaderManager = classLoaderManager; } @Override public Collection<Resource> findResources(String name) { final Collection<Resource> resources = new ArrayList<>(3); final Enumeration<URL> urls; try { urls = classLoaderManager.getClassLoader(name).getResources(name); } catch (IOException e) { throw new ConfigurationException("Error getting resources for "); } while (urls.hasMoreElements()) { resources.add(new URLResourceFix(urls.nextElement())); } return resources; } private class URLResourceFix extends URLResource { URLResourceFix(URL url) { super(url); } @Override public Resource getRelativeResource(String relativePath) { try { String url = getURL().toString(); url = url.substring(0, url.lastIndexOf("/") + 1) + relativePath; return new URLResource(new URI(url).toURL()); } catch (MalformedURLException | URISyntaxException e) { throw new CayenneRuntimeException( "Error creating relative resource '%s' : '%s'", e, getURL(), relativePath); } } } } 


рдЗрд╕рдХреА рдПрдХ рд▓рд╛рдЗрди рд╣реИ

 return new URLResource(new URL(url, relativePath)); 

рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд:

 String url = getURL().toString(); url = url.substring(0, url.lastIndexOf("/") + 1) + relativePath; return new URLResource(new URI(url).toURL()); 

рдореИрдВ рдмрд╛рдЗрдирд░реА (70 рдПрдордмреА) рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, http: // localhost: 8080 / рд╣реИрд▓реЛ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд▓рд┐рдВрдХ: рдЧрд┐рддреБрдм: рджреЗрд╢реА-рдорд╛рдЗрдХреНрд░реЛрдирд╛рдпрдЯ-рд╕реЗрдпреЗрди-рдбреЗрдореЛ ред

рдирд┐рд╖реНрдХрд░реНрд╖


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

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

  • рдПрдХрдорд╛рддреНрд░ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рдлрд╝рд╛рдЗрд▓ (рд▓рдЧрднрдЧ, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ libc) рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛ рдорд╢реАрди рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд╕рдХрддреА рд╣реИрдВред
  • рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдФрд╕рддрди 40 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдмрдирд╛рдо 2 рд╕реЗрдХрдВрдб рд╣реЛрддрд╛ рд╣реИред

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

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


All Articles