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: