diff --git a/generators/server/files.js b/generators/server/files.js
index a1922a4d..022d51b9 100644
--- a/generators/server/files.js
+++ b/generators/server/files.js
@@ -381,11 +381,6 @@ const serverFiles = {
renameTo: generator => `${generator.javaDir}config/package-info.java`,
useBluePrint: true,
},
- {
- file: 'package/config/SnakeCasePhysicalNamingStrategy.java',
- renameTo: generator => `${generator.javaDir}config/SnakeCasePhysicalNamingStrategy.java`,
- useBluePrint: true,
- },
{
file: 'package/config/metric/JHipsterMetricsEndpoint.java',
renameTo: generator => `${generator.javaDir}config/metric/JHipsterMetricsEndpoint.java`,
@@ -990,7 +985,21 @@ const serverFiles = {
],
serverBuild: [
{
- templates: [{ file: 'checkstyle.xml', options: { interpolate: INTERPOLATE_REGEX } }],
+ templates: [
+ { file: 'checkstyle.xml', options: { interpolate: INTERPOLATE_REGEX } },
+ {
+ file: 'resources.json',
+ renameTo: generator =>
+ `src/main/resources/META-INF/native-image/${generator.packageName}/${generator.dasherizedBaseName}-${generator.mainClass}/resources.json`,
+ useBluePrint: true,
+ },
+ {
+ file: 'reflection.json',
+ renameTo: generator =>
+ `src/main/resources/META-INF/native-image/${generator.packageName}/${generator.dasherizedBaseName}-${generator.mainClass}/reflection.json`,
+ useBluePrint: true,
+ },
+ ],
},
{
condition: generator => generator.buildTool === 'gradle',
diff --git a/generators/server/templates/build.gradle.ejs b/generators/server/templates/build.gradle.ejs
index 4990899a..cbb69faf 100644
--- a/generators/server/templates/build.gradle.ejs
+++ b/generators/server/templates/build.gradle.ejs
@@ -276,6 +276,8 @@ dependencies {
annotationProcessor "io.micronaut:micronaut-inject-java"
annotationProcessor "io.micronaut:micronaut-validation"
+ compileOnly("org.graalvm.nativeimage:svm:21.0.0.2")
+ annotationProcessor("io.micronaut:micronaut-graal")
<%_ if (databaseType === 'sql') { _%>
annotationProcessor "io.micronaut.data:micronaut-data-processor:$micronaut_data_version"
<%_ } _%>
@@ -297,7 +299,6 @@ dependencies {
implementation "ch.qos.logback:logback-classic:$logback_version"
implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version"
implementation "io.dropwizard.metrics:metrics-core"
- implementation "io.micrometer:micrometer-registry-prometheus"
implementation "net.logstash.logback:logstash-logback-encoder"
implementation "com.fasterxml.jackson.datatype:jackson-datatype-hppc"
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
@@ -404,9 +405,11 @@ dependencies {
compileOnly "org.graalvm.nativeimage:svm"
- implementation "io.micronaut.liquibase:micronaut-liquibase"
+ implementation "io.micronaut.liquibase:micronaut-liquibase:3.0.2"
implementation "io.micronaut.sql:micronaut-jdbc-hikari"
implementation "io.micronaut.jmx:micronaut-jmx"
+
+ implementation "io.micrometer:micrometer-registry-prometheus"
implementation "io.micronaut.micrometer:micronaut-micrometer-core"
implementation "io.micronaut.micrometer:micronaut-micrometer-registry-prometheus"
implementation "io.micronaut.data:micronaut-data-runtime:$micronaut_data_version"
diff --git a/generators/server/templates/gradle/docker.gradle.ejs b/generators/server/templates/gradle/docker.gradle.ejs
index 52455051..a36b271c 100644
--- a/generators/server/templates/gradle/docker.gradle.ejs
+++ b/generators/server/templates/gradle/docker.gradle.ejs
@@ -12,13 +12,29 @@ task copyIntoLayers (type: Copy) {
}
dockerBuild.dependsOn copyIntoLayers
+dockerBuildNative.dependsOn copyIntoLayers
dockerfileNative {
- baseImage = "oracle/graalvm-ce:20.3.0-java11"
- args("-Xmx64m")
+ baseImage = "ghcr.io/graalvm/graalvm-ce:java11-21.0.0.2"
+ args("-Xmx128m")
}
nativeImage {
- args('--static')
+ args('--static',
+ '-H:Name=<%= dasherizedBaseName %>',
+ '-H:Class=<%=packageName%>.<%=mainClass%>',
+ '--no-fallback',
+ '-H:+ReportExceptionStackTraces',
+ '-H:IncludeResourceBundles=liquibase/i18n/liquibase-core',
+ '-H:ReflectionConfigurationFiles=resources/META-INF/native-image/<%=packageName%>/<%=dasherizedBaseName%>-<%=mainClass%>/reflection.json',
+ '-H:ResourceConfigurationFiles=resources/META-INF/native-image/<%=packageName%>/<%=dasherizedBaseName%>-<%=mainClass%>/resources.json',
+ '--report-unsupported-elements-at-runtime',
+ '--enable-all-security-services',
+ '-H:+AllowVMInspection',
+ '-H:+ReportUnsupportedElementsAtRuntime',
+ '-H:+JNI',
+ '-H:-SpawnIsolates'
+
+ )
}
dockerBuildNative {
images = ["<%= baseName %>:$project.version"]
diff --git a/generators/server/templates/pom.xml.ejs b/generators/server/templates/pom.xml.ejs
index e5a50c19..a3a73369 100644
--- a/generators/server/templates/pom.xml.ejs
+++ b/generators/server/templates/pom.xml.ejs
@@ -679,6 +679,10 @@ if (devDatabaseType === 'postgresql' || prodDatabaseType === 'postgresql') { _%>
org.apache.maven.plugins
maven-surefire-plugin
+
+ com.google.cloud.tools
+ jib-maven-plugin
+
org.jacoco
jacoco-maven-plugin
@@ -692,10 +696,6 @@ if (devDatabaseType === 'postgresql' || prodDatabaseType === 'postgresql') { _%>
liquibase-maven-plugin
${liquibase.version}
-
- com.google.cloud.tools
- jib-maven-plugin
-
org.codehaus.mojo
properties-maven-plugin
@@ -852,7 +852,6 @@ if (devDatabaseType === 'postgresql' || prodDatabaseType === 'postgresql') { _%>
<%= baseName %>
- hibernate:spring:<%=packageName%>.domain?dialect=&hibernate.physical_naming_strategy=<%=packageName%>.config.SnakeCasePhysicalNamingStrategy
true
debug
!test
diff --git a/generators/server/templates/reflection.json.ejs b/generators/server/templates/reflection.json.ejs
new file mode 100644
index 00000000..69646afd
--- /dev/null
+++ b/generators/server/templates/reflection.json.ejs
@@ -0,0 +1,225 @@
+[
+ {
+ "name":"ch.qos.logback.classic.Logger"
+ },
+ {
+ "name": "io.github.jhipster.domain.util.FixedPostgreSQL10Dialect",
+ "allPublicMethods": true,
+ "methods": [{ "name": "", "parameterTypes": [] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder",
+ "allPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.jul.LevelChangePropagator",
+ "allPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.DateConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.LevelConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.LoggerConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.MessageConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.classic.pattern.ThreadConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"ch.qos.logback.core.ConsoleAppender",
+ "allPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"io.reactivex.Completable"
+ },
+ {
+ "name":"io.reactivex.Maybe"
+ },
+ {
+ "name":"io.reactivex.Observable"
+ },
+ {
+ "name":"io.reactivex.Single"
+ },
+ {
+ "name":"java.io.FilePermission"
+ },
+ {
+ "name":"java.lang.RuntimePermission"
+ },
+ {
+ "name":"java.lang.String[]"
+ },
+ {
+ "name":"java.lang.Throwable",
+ "methods":[{"name":"getSuppressed","parameterTypes":[] }]
+ },
+ {
+ "name":"java.lang.management.ManagementFactory",
+ "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+ },
+ {
+ "name":"java.lang.management.RuntimeMXBean",
+ "methods":[{"name":"getInputArguments","parameterTypes":[] }]
+ },
+ {
+ "name":"java.net.NetPermission"
+ },
+ {
+ "name":"java.net.SocketPermission"
+ },
+ {
+ "name":"java.net.URLPermission",
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+ },
+ {
+ "name":"java.nio.Bits",
+ "fields":[{"name":"UNALIGNED"}]
+ },
+ {
+ "name":"java.nio.Buffer",
+ "fields":[{"name":"address", "allowUnsafeAccess":true}]
+ },
+ {
+ "name":"java.nio.DirectByteBuffer",
+ "methods":[{"name":"","parameterTypes":["long","int"] }]
+ },
+ {
+ "name":"java.security.AllPermission"
+ },
+ {
+ "name":"java.security.SecurityPermission"
+ },
+ {
+ "name":"java.sql.Date"
+ },
+ {
+ "name":"java.sql.Timestamp"
+ },
+ {
+ "name":"java.util.PropertyPermission"
+ },
+ {
+ "name":"java.util.ServiceLoader",
+ "methods":[{"name":"stream","parameterTypes":[] }]
+ },
+ {
+ "name":"java.util.ServiceLoader$Provider",
+ "methods":[{"name":"type","parameterTypes":[] }]
+ },
+ {
+ "name":"javax.management.ObjectName"
+ },
+ {
+ "name":"jdk.internal.misc.Unsafe",
+ "methods":[{"name":"getUnsafe","parameterTypes":[] }]
+ },
+ {
+ "name":"org.hibernate.internal.CoreMessageLogger_$logger",
+ "methods":[{"name":"","parameterTypes":["org.jboss.logging.Logger"] }]
+ },
+ {
+ "name":"org.postgresql.Driver",
+ "methods":[{"name":"","parameterTypes":[] }]
+ },
+ {
+ "name":"org.postgresql.PGProperty",
+ "fields":[
+ {"name":"ALLOW_ENCODING_CHANGES"},
+ {"name":"APPLICATION_NAME"},
+ {"name":"ASSUME_MIN_SERVER_VERSION"},
+ {"name":"AUTOSAVE"},
+ {"name":"BINARY_TRANSFER"},
+ {"name":"BINARY_TRANSFER_DISABLE"},
+ {"name":"BINARY_TRANSFER_ENABLE"},
+ {"name":"CANCEL_SIGNAL_TIMEOUT"},
+ {"name":"CLEANUP_SAVEPOINTS"},
+ {"name":"CONNECT_TIMEOUT"},
+ {"name":"CURRENT_SCHEMA"},
+ {"name":"DATABASE_METADATA_CACHE_FIELDS"},
+ {"name":"DATABASE_METADATA_CACHE_FIELDS_MIB"},
+ {"name":"DEFAULT_ROW_FETCH_SIZE"},
+ {"name":"DISABLE_COLUMN_SANITISER"},
+ {"name":"ESCAPE_SYNTAX_CALL_MODE"},
+ {"name":"GSS_LIB"},
+ {"name":"HIDE_UNPRIVILEGED_OBJECTS"},
+ {"name":"HOST_RECHECK_SECONDS"},
+ {"name":"JAAS_APPLICATION_NAME"},
+ {"name":"JAAS_LOGIN"},
+ {"name":"KERBEROS_SERVER_NAME"},
+ {"name":"LOAD_BALANCE_HOSTS"},
+ {"name":"LOGGER_FILE"},
+ {"name":"LOGGER_LEVEL"},
+ {"name":"LOGIN_TIMEOUT"},
+ {"name":"LOG_SERVER_ERROR_DETAIL"},
+ {"name":"LOG_UNCLOSED_CONNECTIONS"},
+ {"name":"MAX_RESULT_BUFFER"},
+ {"name":"OPTIONS"},
+ {"name":"PASSWORD"},
+ {"name":"PG_DBNAME"},
+ {"name":"PG_HOST"},
+ {"name":"PG_PORT"},
+ {"name":"PREFER_QUERY_MODE"},
+ {"name":"PREPARED_STATEMENT_CACHE_QUERIES"},
+ {"name":"PREPARED_STATEMENT_CACHE_SIZE_MIB"},
+ {"name":"PREPARE_THRESHOLD"},
+ {"name":"PROTOCOL_VERSION"},
+ {"name":"READ_ONLY"},
+ {"name":"READ_ONLY_MODE"},
+ {"name":"RECEIVE_BUFFER_SIZE"},
+ {"name":"REPLICATION"},
+ {"name":"REWRITE_BATCHED_INSERTS"},
+ {"name":"SEND_BUFFER_SIZE"},
+ {"name":"SOCKET_FACTORY"},
+ {"name":"SOCKET_FACTORY_ARG"},
+ {"name":"SOCKET_TIMEOUT"},
+ {"name":"SSL"},
+ {"name":"SSL_CERT"},
+ {"name":"SSL_FACTORY"},
+ {"name":"SSL_FACTORY_ARG"},
+ {"name":"SSL_HOSTNAME_VERIFIER"},
+ {"name":"SSL_KEY"},
+ {"name":"SSL_MODE"},
+ {"name":"SSL_PASSWORD"},
+ {"name":"SSL_PASSWORD_CALLBACK"},
+ {"name":"SSL_ROOT_CERT"},
+ {"name":"SSPI_SERVICE_CLASS"},
+ {"name":"STRING_TYPE"},
+ {"name":"TARGET_SERVER_TYPE"},
+ {"name":"TCP_KEEP_ALIVE"},
+ {"name":"UNKNOWN_LENGTH"},
+ {"name":"USER"},
+ {"name":"USE_SPNEGO"},
+ {"name":"XML_FACTORY_FACTORY"}
+ ]
+ },
+ {
+ "name":"org.slf4j.spi.LocationAwareLogger",
+ "allDeclaredMethods":true
+ },
+ {
+ "name":"sun.misc.Unsafe",
+ "fields":[{"name":"theUnsafe"}],
+ "methods":[
+ {"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] },
+ {"name":"invokeCleaner","parameterTypes":["java.nio.ByteBuffer"] }
+ ]
+ }
+]
diff --git a/generators/server/templates/resources.json.ejs b/generators/server/templates/resources.json.ejs
new file mode 100644
index 00000000..47811982
--- /dev/null
+++ b/generators/server/templates/resources.json.ejs
@@ -0,0 +1,18 @@
+{
+ "resources":[
+ {"pattern":"\\Q\\E"},
+ {"pattern":"\\Qapplication-prod.yml\\E"},
+ {"pattern":"\\Qapplication.yml\\E"},
+ {"pattern":".*/*.*xml$"},
+ {"pattern":".*/*.*ico$"},
+ {"pattern":".*/*.*js$"},
+ {"pattern":".*/*.*html$"},
+ {"pattern":".*/*.*svg$"},
+ {"pattern":".*/*.*json$"},
+ {"pattern":".*/*.*css$"},
+ {"pattern":".*/*.*png$"}
+ ],
+ "bundles":[
+ {"name":"i18n.messages"}
+ ]
+ }
diff --git a/generators/server/templates/src/main/java/package/App.java.ejs b/generators/server/templates/src/main/java/package/App.java.ejs
index 4fd209ab..db12a9ee 100644
--- a/generators/server/templates/src/main/java/package/App.java.ejs
+++ b/generators/server/templates/src/main/java/package/App.java.ejs
@@ -7,6 +7,7 @@ import io.github.jhipster.config.JHipsterConstants;
import io.micronaut.context.ApplicationContext;
import io.micronaut.context.env.Environment;
import io.micronaut.core.cli.CommandLine;
+import io.micronaut.core.annotation.TypeHint;
import io.micronaut.runtime.ApplicationConfiguration;
import io.micronaut.runtime.Micronaut;
import io.micronaut.runtime.server.EmbeddedServer;
@@ -27,6 +28,15 @@ import java.util.*;
description = "<%= baseName %> API"
)
)
+@TypeHint(value = {
+ org.HdrHistogram.Histogram.class, org.HdrHistogram.ConcurrentHistogram.class,
+ },
+ accessType = {
+ TypeHint.AccessType.ALL_DECLARED_CONSTRUCTORS,
+ TypeHint.AccessType.ALL_DECLARED_FIELDS,
+ TypeHint.AccessType.ALL_DECLARED_METHODS
+ }
+)
public class <%= mainClass %> {
private static final Logger log = LoggerFactory.getLogger(<%= mainClass %>.class);
diff --git a/generators/server/templates/src/main/java/package/config/SnakeCasePhysicalNamingStrategy.java.ejs b/generators/server/templates/src/main/java/package/config/SnakeCasePhysicalNamingStrategy.java.ejs
deleted file mode 100644
index 8e9496ed..00000000
--- a/generators/server/templates/src/main/java/package/config/SnakeCasePhysicalNamingStrategy.java.ejs
+++ /dev/null
@@ -1,45 +0,0 @@
-package <%=packageName%>.config;
-
-import org.hibernate.boot.model.naming.Identifier;
-import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
-import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
-
-public class SnakeCasePhysicalNamingStrategy implements PhysicalNamingStrategy {
-
- @Override
- public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
- return convertToSnakeCase(identifier);
- }
-
- @Override
- public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
- return convertToSnakeCase(identifier);
- }
-
- @Override
- public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
- return convertToSnakeCase(identifier);
- }
-
- @Override
- public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
- return convertToSnakeCase(identifier);
- }
-
- @Override
- public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
- return convertToSnakeCase(identifier);
- }
-
- private Identifier convertToSnakeCase(final Identifier identifier) {
- if (identifier == null) {
- return null;
- }
- final String regex = "([a-z])([A-Z])";
- final String replacement = "$1_$2";
- final String newName = identifier.getText()
- .replaceAll(regex, replacement)
- .toLowerCase();
- return Identifier.toIdentifier(newName);
- }
-}
diff --git a/generators/server/templates/src/main/resources/application.yml.ejs b/generators/server/templates/src/main/resources/application.yml.ejs
index 7dd42414..2cdc5ac7 100644
--- a/generators/server/templates/src/main/resources/application.yml.ejs
+++ b/generators/server/templates/src/main/resources/application.yml.ejs
@@ -161,7 +161,6 @@ jpa:
jdbc:
time_zone: UTC
ddl-auto: none
- physical_naming_strategy: <%=packageName%>.config.SnakeCasePhysicalNamingStrategy
<%_ if (serviceDiscoveryType === 'consul') { _%>
consul: