From 79b81534113d127792a649585846090e20b5768f Mon Sep 17 00:00:00 2001 From: Manyanda Chitimbo Date: Wed, 20 Nov 2019 12:34:49 +0100 Subject: [PATCH] feat(core): add NativeEnableAllTimeZonesBuildItem build item --- .../NativeEnableAllCharsetsBuildItem.java | 4 +++ ...NativeImageEnableAllCharsetsBuildItem.java | 7 +++++ ...ativeImageEnableAllTimeZonesBuildItem.java | 7 +++++ .../DeprecatedBuildItemProcessor.java | 7 +++++ .../pkg/steps/NativeImageBuildStep.java | 6 ++++ .../steps/NativeImageConfigBuildStep.java | 12 +++++-- .../src/main/asciidoc/writing-extensions.adoc | 31 ++++++++++--------- .../jdbc/mssql/deployment/MsSQLProcessor.java | 6 ++-- .../mysql/deployment/JDBCMySQLProcessor.java | 6 ++-- 9 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllCharsetsBuildItem.java create mode 100644 core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllTimeZonesBuildItem.java diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeEnableAllCharsetsBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeEnableAllCharsetsBuildItem.java index 2e2426cf91adf..e04266e7b0818 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeEnableAllCharsetsBuildItem.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeEnableAllCharsetsBuildItem.java @@ -2,6 +2,10 @@ import io.quarkus.builder.item.MultiBuildItem; +/** + * @deprecated use {@link NativeImageEnableAllCharsetsBuildItem} instead + */ +@Deprecated public final class NativeEnableAllCharsetsBuildItem extends MultiBuildItem { } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllCharsetsBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllCharsetsBuildItem.java new file mode 100644 index 0000000000000..36e6e50cd5a08 --- /dev/null +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllCharsetsBuildItem.java @@ -0,0 +1,7 @@ +package io.quarkus.deployment.builditem; + +import io.quarkus.builder.item.MultiBuildItem; + +public final class NativeImageEnableAllCharsetsBuildItem extends MultiBuildItem { + +} diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllTimeZonesBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllTimeZonesBuildItem.java new file mode 100644 index 0000000000000..4223eceba4d21 --- /dev/null +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/NativeImageEnableAllTimeZonesBuildItem.java @@ -0,0 +1,7 @@ +package io.quarkus.deployment.builditem; + +import io.quarkus.builder.item.MultiBuildItem; + +public final class NativeImageEnableAllTimeZonesBuildItem extends MultiBuildItem { + +} diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/substrate/DeprecatedBuildItemProcessor.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/substrate/DeprecatedBuildItemProcessor.java index 2fe553f189d55..b6576c76545a3 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/builditem/substrate/DeprecatedBuildItemProcessor.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/substrate/DeprecatedBuildItemProcessor.java @@ -5,6 +5,8 @@ import java.util.Map; import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.NativeEnableAllCharsetsBuildItem; +import io.quarkus.deployment.builditem.NativeImageEnableAllCharsetsBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; @@ -192,4 +194,9 @@ List substrateSystemProperties(List oldProps) { + return new NativeImageEnableAllCharsetsBuildItem(); + } } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java index bf8769bb7598c..ad5d4be80a4e9 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java @@ -145,6 +145,7 @@ public NativeImageBuildItem build(NativeConfig nativeConfig, NativeImageSourceJa process.waitFor(); } Boolean enableSslNative = false; + boolean enableAllTimeZones = false; for (NativeImageSystemPropertyBuildItem prop : nativeImageProperties) { //todo: this should be specific build items if (prop.getKey().equals("quarkus.ssl.native") && prop.getValue() != null) { @@ -155,6 +156,8 @@ public NativeImageBuildItem build(NativeConfig nativeConfig, NativeImageSourceJa nativeConfig.enableAllSecurityServices |= Boolean.parseBoolean(prop.getValue()); } else if (prop.getKey().equals("quarkus.native.enable-all-charsets") && prop.getValue() != null) { nativeConfig.addAllCharsets |= Boolean.parseBoolean(prop.getValue()); + } else if (prop.getKey().equals("quarkus.native.enable-all-timezones") && prop.getValue() != null) { + enableAllTimeZones = Boolean.parseBoolean(prop.getValue()); } else { // todo maybe just -D is better than -J-D in this case if (prop.getValue() == null) { @@ -222,6 +225,9 @@ public NativeImageBuildItem build(NativeConfig nativeConfig, NativeImageSourceJa } else { command.add("-H:-AddAllCharsets"); } + if (enableAllTimeZones) { + command.add("-H:+IncludeAllTimeZones"); + } if (!protocols.isEmpty()) { command.add("-H:EnableURLProtocols=" + String.join(",", protocols)); } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageConfigBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageConfigBuildStep.java index 05413732fca39..5e927b960982b 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageConfigBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageConfigBuildStep.java @@ -18,7 +18,8 @@ import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem; import io.quarkus.deployment.builditem.JavaLibraryPathAdditionalPathBuildItem; import io.quarkus.deployment.builditem.JniBuildItem; -import io.quarkus.deployment.builditem.NativeEnableAllCharsetsBuildItem; +import io.quarkus.deployment.builditem.NativeImageEnableAllCharsetsBuildItem; +import io.quarkus.deployment.builditem.NativeImageEnableAllTimeZonesBuildItem; import io.quarkus.deployment.builditem.SslNativeConfigBuildItem; import io.quarkus.deployment.builditem.SslTrustStoreSystemPropertyBuildItem; import io.quarkus.deployment.builditem.SystemPropertyBuildItem; @@ -43,7 +44,8 @@ void build(SslContextConfigurationRecorder sslContextConfigurationRecorder, List nativeImageConfigBuildItems, SslNativeConfigBuildItem sslNativeConfig, List jniBuildItems, - List nativeEnableAllCharsetsBuildItems, + List nativeImageEnableAllCharsetsBuildItems, + List nativeImageEnableAllTimeZonesBuildItems, List extensionSslNativeSupport, List enableAllSecurityServicesBuildItems, BuildProducer proxy, @@ -137,9 +139,13 @@ void build(SslContextConfigurationRecorder sslContextConfigurationRecorder, nativeImage.produce(new NativeImageSystemPropertyBuildItem("quarkus.jni.enable", "true")); } - if (!nativeEnableAllCharsetsBuildItems.isEmpty()) { + if (!nativeImageEnableAllCharsetsBuildItems.isEmpty()) { nativeImage.produce(new NativeImageSystemPropertyBuildItem("quarkus.native.enable-all-charsets", "true")); } + + if (!nativeImageEnableAllTimeZonesBuildItems.isEmpty()) { + nativeImage.produce(new NativeImageSystemPropertyBuildItem("quarkus.native.enable-all-timezones", "true")); + } } private Boolean isSslNativeEnabled(SslNativeConfigBuildItem sslNativeConfig, diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index 5b7a68781a322..04adda6721fe3 100755 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -1660,9 +1660,12 @@ A class that will be initialized at runtime rather than build time. This will ca `io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem`:: A convenience feature that allows you to control most of the above features from a single build item. -`io.quarkus.deployment.builditem.NativeEnableAllCharsetsBuildItem`:: +`io.quarkus.deployment.builditem.NativeImageEnableAllCharsetsBuildItem`:: Indicates that all charsets should be enabled in native image. +`io.quarkus.deployment.builditem.NativeImageEnableAllTimeZonesBuildItem`:: +Indicates that all timezones should be enabled in native image. + `io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem`:: A convenient way to tell Quarkus that the extension requires SSL and it should be enabled during native image build. When using this feature, remember to add your extension to the list of extensions that offer SSL support automatically on the https://github.com/quarkusio/quarkus/blob/master/docs/src/main/asciidoc/native-and-ssl.adoc[native and ssl guide]. @@ -2099,16 +2102,16 @@ public final class MyExtProcessor { @BuildStep void registerNativeImageReources(BuildProducer services) { String service = "META-INF/services/" + io.quarkus.SomeService.class.getName(); - + // find out all the implementation classes listed in the service files - Set implementations = + Set implementations = ServiceUtil.classNamesNamedIn(Thread.currentThread().getContextClassLoader(), service); - // register every listed implementation class so they can be instantiated + // register every listed implementation class so they can be instantiated // in native-image at run-time services.produce( - new ServiceProviderBuildItem(io.quarkus.SomeService.class.getName(), + new ServiceProviderBuildItem(io.quarkus.SomeService.class.getName(), implementations.toArray(new String[0]))); } } @@ -2130,13 +2133,13 @@ public final class MyExtProcessor { void registerNativeImageReources(BuildProducer resource, BuildProducer reflectionClasses) { String service = "META-INF/services/" + io.quarkus.SomeService.class.getName(); - + // register the service file so it is visible in native-image resource.produce(new NativeImageResourceBuildItem(service)); - - // register every listed implementation class so they can be inspected/instantiated + + // register every listed implementation class so they can be inspected/instantiated // in native-image at run-time - Set implementations = + Set implementations = ServiceUtil.classNamesNamedIn(Thread.currentThread().getContextClassLoader(), service); reflectionClasses.produce( @@ -2148,7 +2151,7 @@ public final class MyExtProcessor { While this is the easiest way to get your services running natively, it's less efficient than scanning the implementation classes at build time and generating code that registers them at static-init time instead of relying on reflection. -You can achieve that by adapting the previous build step to use a static-init recorder instead of registering +You can achieve that by adapting the previous build step to use a static-init recorder instead of registering classes for reflection: [source,java] @@ -2157,19 +2160,19 @@ public final class MyExtProcessor { @BuildStep @Record(ExecutionTime.STATIC_INIT) - void registerNativeImageReources(RecorderContext recorderContext, + void registerNativeImageReources(RecorderContext recorderContext, SomeServiceRecorder recorder) { String service = "META-INF/services/" + io.quarkus.SomeService.class.getName(); - + // read the implementation classes Collection> implementationClasses = new LinkedHashSet<>(); Set implementations = ServiceUtil.classNamesNamedIn(Thread.currentThread().getContextClassLoader(), service); for(String implementation : implementations) { - implementationClasses.add((Class) + implementationClasses.add((Class) recorderContext.classProxy(implementation)); } - + // produce a static-initializer with those classes recorder.configure(implementationClasses); } diff --git a/extensions/jdbc/jdbc-mssql/deployment/src/main/java/io/quarkus/jdbc/mssql/deployment/MsSQLProcessor.java b/extensions/jdbc/jdbc-mssql/deployment/src/main/java/io/quarkus/jdbc/mssql/deployment/MsSQLProcessor.java index 9e33e50941aee..d74bd95cbfe0a 100644 --- a/extensions/jdbc/jdbc-mssql/deployment/src/main/java/io/quarkus/jdbc/mssql/deployment/MsSQLProcessor.java +++ b/extensions/jdbc/jdbc-mssql/deployment/src/main/java/io/quarkus/jdbc/mssql/deployment/MsSQLProcessor.java @@ -3,7 +3,7 @@ import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; -import io.quarkus.deployment.builditem.NativeEnableAllCharsetsBuildItem; +import io.quarkus.deployment.builditem.NativeImageEnableAllCharsetsBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem; public class MsSQLProcessor { @@ -15,9 +15,9 @@ FeatureBuildItem feature() { @BuildStep void nativeResources(BuildProducer resources, - BuildProducer nativeEnableAllCharsets) { + BuildProducer nativeEnableAllCharsets) { resources.produce(new NativeImageResourceBundleBuildItem("com.microsoft.sqlserver.jdbc.SQLServerResource")); - nativeEnableAllCharsets.produce(new NativeEnableAllCharsetsBuildItem()); + nativeEnableAllCharsets.produce(new NativeImageEnableAllCharsetsBuildItem()); } } diff --git a/extensions/jdbc/jdbc-mysql/deployment/src/main/java/io/quarkus/jdbc/mysql/deployment/JDBCMySQLProcessor.java b/extensions/jdbc/jdbc-mysql/deployment/src/main/java/io/quarkus/jdbc/mysql/deployment/JDBCMySQLProcessor.java index 5103a7e49e7ce..8f29c9f3bd18c 100644 --- a/extensions/jdbc/jdbc-mysql/deployment/src/main/java/io/quarkus/jdbc/mysql/deployment/JDBCMySQLProcessor.java +++ b/extensions/jdbc/jdbc-mysql/deployment/src/main/java/io/quarkus/jdbc/mysql/deployment/JDBCMySQLProcessor.java @@ -2,7 +2,7 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.FeatureBuildItem; -import io.quarkus.deployment.builditem.NativeEnableAllCharsetsBuildItem; +import io.quarkus.deployment.builditem.NativeImageEnableAllCharsetsBuildItem; import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; public class JDBCMySQLProcessor { @@ -17,7 +17,7 @@ NativeImageResourceBuildItem resource() { } @BuildStep - NativeEnableAllCharsetsBuildItem enableAllCharsets() { - return new NativeEnableAllCharsetsBuildItem(); + NativeImageEnableAllCharsetsBuildItem enableAllCharsets() { + return new NativeImageEnableAllCharsetsBuildItem(); } }