diff --git a/build.gradle b/build.gradle index 5c4748e..17ffcec 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ allprojects { subproject -> withSourcesJar() modularity.inferModulePath = true toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(23) vendor = JvmVendorSpec.ORACLE } } diff --git a/gbcs-native/build.gradle b/gbcs-native/build.gradle new file mode 100644 index 0000000..d32b6d8 --- /dev/null +++ b/gbcs-native/build.gradle @@ -0,0 +1,56 @@ +plugins { + id 'java-library' + alias catalog.plugins.sambal + alias catalog.plugins.graalvm.native.image +} + + +import net.woggioni.gradle.graalvm.* + +Property mainModuleName = objects.property(String.class) +mainModuleName.set('net.woggioni.gbcs.cli') +Property mainClassName = objects.property(String.class) +mainClassName.set('net.woggioni.gbcs.graal.NativeServer') + +tasks.named(JavaPlugin.COMPILE_JAVA_TASK_NAME, JavaCompile) { + options.javaModuleMainClass = mainClassName +} + +configurations { + release { + transitive = false + canBeConsumed = true + canBeResolved = true + visible = true + } +} + +dependencies { + implementation catalog.jwo + implementation catalog.netty.transport + implementation project(':gbcs-server') + implementation project(':gbcs-server-memcache') + +// runtimeOnly catalog.slf4j.jdk14 + runtimeOnly catalog.logback.classic +// runtimeOnly catalog.slf4j.simple +} + +tasks.named(NativeImagePlugin.CONFIGURE_NATIVE_IMAGE_TASK_NAME, NativeImageConfigurationTask.class) { + mainClass = 'net.woggioni.gbcs.graal.ConfigureNativeServer' +// mainModule = mainModuleName + systemProperty('logback.configurationFile', 'classpath:net/woggioni/gbcs/graal/logback.xml') + systemProperty('io.netty.leakDetectionLevel', 'DISABLED') + modularity.inferModulePath = false + mergeConfiguration = true + enabled = false +} + +tasks.named(NativeImagePlugin.NATIVE_IMAGE_TASK_NAME, NativeImageTask) { + mainClass = mainClassName +// mainModule = mainModuleName + useMusl = true + buildStaticImage = true + linkAtBuildTime = false +} + diff --git a/gbcs-native/native-image/jni-config.json b/gbcs-native/native-image/jni-config.json new file mode 100644 index 0000000..8b4e417 --- /dev/null +++ b/gbcs-native/native-image/jni-config.json @@ -0,0 +1,6 @@ +[ +{ + "name":"java.lang.Boolean", + "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] +} +] diff --git a/gbcs-native/native-image/native-image.properties b/gbcs-native/native-image/native-image.properties new file mode 100644 index 0000000..7b1072d --- /dev/null +++ b/gbcs-native/native-image/native-image.properties @@ -0,0 +1,2 @@ +Args=-O3 --gc=G1 --enable-url-protocols=jpms --initialize-at-run-time=io.netty --initialize-at-build-time=net.woggioni.gbcs.common.GbcsUrlStreamHandlerFactory,net.woggioni.gbcs.common.GbcsUrlStreamHandlerFactory$JpmsHandler,org.apache.logging.slf4j.SLF4JLogger +#-H:TraceClassInitialization=io.netty.handler.ssl.BouncyCastleAlpnSslUtils \ No newline at end of file diff --git a/gbcs-native/native-image/predefined-classes-config.json b/gbcs-native/native-image/predefined-classes-config.json new file mode 100644 index 0000000..0e79b2c --- /dev/null +++ b/gbcs-native/native-image/predefined-classes-config.json @@ -0,0 +1,8 @@ +[ + { + "type":"agent-extracted", + "classes":[ + ] + } +] + diff --git a/gbcs-native/native-image/proxy-config.json b/gbcs-native/native-image/proxy-config.json new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/gbcs-native/native-image/proxy-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/gbcs-native/native-image/reachability-metadata.json b/gbcs-native/native-image/reachability-metadata.json new file mode 100644 index 0000000..f508175 --- /dev/null +++ b/gbcs-native/native-image/reachability-metadata.json @@ -0,0 +1,1278 @@ +{ + "reflection": [ + { + "type": "ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "ch.qos.logback.classic.joran.SerializedModelConfigurator", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "ch.qos.logback.classic.spi.LogbackServiceProvider" + }, + { + "type": "ch.qos.logback.classic.util.DefaultJoranConfigurator", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "ch.qos.logback.core.ConsoleAppender", + "methods": [ + { + "name": "", + "parameterTypes": [] + }, + { + "name": "setTarget", + "parameterTypes": [ + "java.lang.String" + ] + } + ] + }, + { + "type": "ch.qos.logback.core.OutputStreamAppender", + "methods": [ + { + "name": "setEncoder", + "parameterTypes": [ + "ch.qos.logback.core.encoder.Encoder" + ] + } + ] + }, + { + "type": "ch.qos.logback.core.encoder.Encoder", + "methods": [ + { + "name": "valueOf", + "parameterTypes": [ + "java.lang.String" + ] + } + ] + }, + { + "type": "ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods": [ + { + "name": "setParent", + "parameterTypes": [ + "ch.qos.logback.core.spi.ContextAware" + ] + } + ] + }, + { + "type": "ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods": [ + { + "name": "setPattern", + "parameterTypes": [ + "java.lang.String" + ] + } + ] + }, + { + "type": "ch.qos.logback.core.spi.ContextAware", + "methods": [ + { + "name": "valueOf", + "parameterTypes": [ + "java.lang.String" + ] + } + ] + }, + { + "type": "com.aayushatharva.brotli4j.Brotli4jLoader" + }, + { + "type": "com.github.luben.zstd.Zstd" + }, + { + "type": "com.sun.crypto.provider.AESCipher$General", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.ARCFOURCipher", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.DESCipher", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.DESedeCipher", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.HmacSHA1", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.crypto.provider.PBKDF2Core$HmacSHA1", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.org.apache.xerces.internal.impl.dv.xs.ExtendedSchemaDVFactoryImpl", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.org.apache.xerces.internal.impl.dv.xs.SchemaDVFactoryImpl", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "io.netty.bootstrap.ServerBootstrap$1" + }, + { + "type": "io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor", + "methods": [ + { + "name": "channelRead", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + } + ] + }, + { + "type": "io.netty.buffer.AbstractByteBufAllocator" + }, + { + "type": "io.netty.buffer.AbstractReferenceCountedByteBuf", + "fields": [ + { + "name": "refCnt" + } + ] + }, + { + "type": "io.netty.channel.AbstractChannelHandlerContext", + "fields": [ + { + "name": "handlerState" + } + ] + }, + { + "type": "io.netty.channel.ChannelInboundHandlerAdapter", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { + "type": "io.netty.channel.ChannelInitializer", + "methods": [ + { + "name": "channelRegistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + } + ] + }, + { + "type": "io.netty.channel.ChannelOutboundBuffer", + "fields": [ + { + "name": "totalPendingSize" + }, + { + "name": "unwritable" + } + ] + }, + { + "type": "io.netty.channel.DefaultChannelConfig", + "fields": [ + { + "name": "autoRead" + }, + { + "name": "writeBufferWaterMark" + } + ] + }, + { + "type": "io.netty.channel.DefaultChannelPipeline", + "fields": [ + { + "name": "estimatorHandle" + } + ] + }, + { + "type": "io.netty.channel.DefaultChannelPipeline$HeadContext", + "methods": [ + { + "name": "bind", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "channelActive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "close", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "connect", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "java.net.SocketAddress", + "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "deregister", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "disconnect", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "flush", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "read", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "write", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object", + "io.netty.channel.ChannelPromise" + ] + } + ] + }, + { + "type": "io.netty.channel.DefaultChannelPipeline$TailContext", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ + "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { + "type": "io.netty.channel.embedded.EmbeddedChannel$2" + }, + { + "type": "io.netty.channel.pool.SimpleChannelPool$1" + }, + { + "type": "io.netty.channel.socket.nio.NioServerSocketChannel", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "io.netty.channel.socket.nio.NioSocketChannel", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "io.netty.handler.codec.compression.JdkZlibEncoder" + }, + { + "type": "io.netty.handler.codec.http.HttpObjectAggregator" + }, + { + "type": "io.netty.handler.codec.http.HttpServerCodec" + }, + { + "type": "io.netty.handler.codec.memcache.binary.BinaryMemcacheClientCodec" + }, + { + "type": "io.netty.handler.codec.memcache.binary.BinaryMemcacheObjectAggregator" + }, + { + "type": "io.netty.handler.stream.ChunkedWriteHandler" + }, + { + "type": "io.netty.handler.timeout.IdleStateHandler" + }, + { + "type": "io.netty.util.AbstractReferenceCounted", + "fields": [ + { + "name": "refCnt" + } + ] + }, + { + "type": "io.netty.util.DefaultAttributeMap", + "fields": [ + { + "name": "attributes" + } + ] + }, + { + "type": "io.netty.util.DefaultAttributeMap$DefaultAttribute", + "fields": [ + { + "name": "attributeMap" + } + ] + }, + { + "type": "io.netty.util.Recycler$DefaultHandle", + "fields": [ + { + "name": "state" + } + ] + }, + { + "type": "io.netty.util.ReferenceCountUtil" + }, + { + "type": "io.netty.util.concurrent.DefaultPromise", + "fields": [ + { + "name": "result" + } + ] + }, + { + "type": "io.netty.util.concurrent.SingleThreadEventExecutor", + "fields": [ + { + "name": "state" + }, + { + "name": "threadProperties" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields": [ + { + "name": "producerLimit" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields": [ + { + "name": "consumerIndex" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields": [ + { + "name": "producerIndex" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.unpadded.MpscUnpaddedArrayQueueConsumerIndexField", + "fields": [ + { + "name": "consumerIndex" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.unpadded.MpscUnpaddedArrayQueueProducerIndexField", + "fields": [ + { + "name": "producerIndex" + } + ] + }, + { + "type": "io.netty.util.internal.shaded.org.jctools.queues.unpadded.MpscUnpaddedArrayQueueProducerLimitField", + "fields": [ + { + "name": "producerLimit" + } + ] + }, + { + "type": "java.io.FilePermission" + }, + { + "type": "java.lang.ProcessHandle", + "methods": [ + { + "name": "current", + "parameterTypes": [] + }, + { + "name": "pid", + "parameterTypes": [] + } + ] + }, + { + "type": "java.lang.RuntimePermission" + }, + { + "type": "java.lang.Thread", + "fields": [ + { + "name": "threadLocalRandomProbe" + } + ] + }, + { + "type": "java.net.NetPermission" + }, + { + "type": "java.net.SocketPermission" + }, + { + "type": "java.net.URLPermission", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.String", + "java.lang.String" + ] + } + ] + }, + { + "type": "java.nio.Bits", + "fields": [ + { + "name": "MAX_MEMORY" + }, + { + "name": "UNALIGNED" + } + ] + }, + { + "type": "java.nio.Buffer", + "fields": [ + { + "name": "address" + } + ] + }, + { + "type": "java.nio.ByteBuffer", + "methods": [ + { + "name": "alignedSlice", + "parameterTypes": [ + "int" + ] + } + ] + }, + { + "type": "java.nio.DirectByteBuffer", + "methods": [ + { + "name": "", + "parameterTypes": [ + "long", + "long" + ] + } + ] + }, + { + "type": "java.nio.channels.spi.SelectorProvider", + "methods": [ + { + "name": "openServerSocketChannel", + "parameterTypes": [ + "java.net.ProtocolFamily" + ] + } + ] + }, + { + "type": "java.security.AlgorithmParametersSpi" + }, + { + "type": "java.security.AllPermission" + }, + { + "type": "java.security.KeyStoreSpi" + }, + { + "type": "java.security.SecureRandomParameters" + }, + { + "type": "java.security.SecurityPermission" + }, + { + "type": "java.util.PropertyPermission" + }, + { + "type": "java.util.concurrent.ForkJoinTask", + "fields": [ + { + "name": "aux" + }, + { + "name": "status" + } + ] + }, + { + "type": "java.util.concurrent.atomic.AtomicBoolean", + "fields": [ + { + "name": "value" + } + ] + }, + { + "type": "java.util.concurrent.atomic.AtomicReference", + "fields": [ + { + "name": "value" + } + ] + }, + { + "type": "java.util.concurrent.atomic.Striped64", + "fields": [ + { + "name": "base" + }, + { + "name": "cellsBusy" + } + ] + }, + { + "type": "java.util.concurrent.atomic.Striped64$Cell", + "fields": [ + { + "name": "value" + } + ] + }, + { + "type": "javax.security.auth.x500.X500Principal", + "fields": [ + { + "name": "thisX500Name" + } + ], + "methods": [ + { + "name": "", + "parameterTypes": [ + "sun.security.x509.X500Name" + ] + } + ] + }, + { + "type": "javax.smartcardio.CardPermission" + }, + { + "type": "jdk.internal.misc.Unsafe", + "methods": [ + { + "name": "getUnsafe", + "parameterTypes": [] + } + ] + }, + { + "type": "net.woggioni.gbcs.common.GbcsUrlStreamHandlerFactory" + }, + { + "type": "net.woggioni.gbcs.server.GradleBuildCacheServer$HttpChunkContentCompressor" + }, + { + "type": "net.woggioni.gbcs.server.GradleBuildCacheServer$NettyHttpBasicAuthenticator" + }, + { + "type": "net.woggioni.gbcs.server.GradleBuildCacheServer$ServerInitializer" + }, + { + "type": "net.woggioni.gbcs.server.GradleBuildCacheServer$ServerInitializer$initChannel$4" + }, + { + "type": "net.woggioni.gbcs.server.cache.FileSystemCacheProvider" + }, + { + "type": "net.woggioni.gbcs.server.cache.InMemoryCacheProvider" + }, + { + "type": "net.woggioni.gbcs.server.exception.ExceptionHandler" + }, + { + "type": "net.woggioni.gbcs.server.handler.ServerHandler" + }, + { + "type": "net.woggioni.gbcs.server.memcache.MemcacheCacheProvider" + }, + { + "type": "net.woggioni.gbcs.server.memcache.client.MemcacheClient$sendRequest$1$operationComplete$1" + }, + { + "type": "net.woggioni.gbcs.server.throttling.ThrottlingHandler" + }, + { + "type": "sun.misc.Unsafe", + "fields": [ + { + "name": "theUnsafe" + } + ], + "methods": [ + { + "name": "copyMemory", + "parameterTypes": [ + "java.lang.Object", + "long", + "java.lang.Object", + "long", + "long" + ] + }, + { + "name": "getAndAddLong", + "parameterTypes": [ + "java.lang.Object", + "long", + "long" + ] + }, + { + "name": "getAndSetObject", + "parameterTypes": [ + "java.lang.Object", + "long", + "java.lang.Object" + ] + }, + { + "name": "invokeCleaner", + "parameterTypes": [ + "java.nio.ByteBuffer" + ] + }, + { + "name": "storeFence", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.nio.ch.SelectorImpl", + "fields": [ + { + "name": "publicSelectedKeys" + }, + { + "name": "selectedKeys" + } + ] + }, + { + "type": "sun.security.pkcs12.PKCS12KeyStore", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.provider.JavaKeyStore$JKS", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.provider.NativePRNG", + "methods": [ + { + "name": "", + "parameterTypes": [] + }, + { + "name": "", + "parameterTypes": [ + "java.security.SecureRandomParameters" + ] + } + ] + }, + { + "type": "sun.security.provider.SHA", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.provider.X509Factory", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.rsa.RSAKeyFactory$Legacy", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.ssl.KeyManagerFactoryImpl$SunX509", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.ssl.SSLContextImpl$DefaultSSLContext", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "type": "sun.security.x509.AuthorityInfoAccessExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.AuthorityKeyIdentifierExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.BasicConstraintsExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.CRLDistributionPointsExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.CertificatePoliciesExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.KeyUsageExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.NetscapeCertTypeExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.PrivateKeyUsageExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.SubjectAlternativeNameExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + }, + { + "type": "sun.security.x509.SubjectKeyIdentifierExtension", + "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Boolean", + "java.lang.Object" + ] + } + ] + } + ], + "resources": [ + { + "glob": "META-INF/services/ch.qos.logback.classic.spi.Configurator" + }, + { + "glob": "META-INF/services/java.lang.System$LoggerFinder" + }, + { + "glob": "META-INF/services/java.net.spi.URLStreamHandlerProvider" + }, + { + "glob": "META-INF/services/java.nio.channels.spi.SelectorProvider" + }, + { + "glob": "META-INF/services/java.time.zone.ZoneRulesProvider" + }, + { + "glob": "META-INF/services/javax.xml.parsers.DocumentBuilderFactory" + }, + { + "glob": "META-INF/services/javax.xml.parsers.SAXParserFactory" + }, + { + "glob": "META-INF/services/net.woggioni.gbcs.api.CacheProvider" + }, + { + "glob": "META-INF/services/org.slf4j.spi.SLF4JServiceProvider" + }, + { + "glob": "classpath:net/woggioni/gbcs/graal/logback.xml" + }, + { + "glob": "logback-test.scmo" + }, + { + "glob": "logback.scmo" + }, + { + "glob": "net/woggioni/gbcs/graal/logback.xml" + }, + { + "glob": "net/woggioni/gbcs/server/memcache/schema/gbcs-memcache.xsd" + }, + { + "glob": "net/woggioni/gbcs/server/schema/gbcs.xsd" + }, + { + "module": "java.xml", + "glob": "com/sun/org/apache/xerces/internal/impl/xpath/regex/message.properties" + }, + { + "module": "java.xml", + "glob": "com/sun/org/apache/xerces/internal/impl/xpath/regex/message_en.properties" + }, + { + "module": "java.xml", + "glob": "com/sun/org/apache/xerces/internal/impl/xpath/regex/message_en_SG.properties" + }, + { + "module": "java.xml", + "glob": "jdk/xml/internal/jdkcatalog/JDKCatalog.xml" + } + ], + "bundles": [ + { + "name": "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages" + }, + { + "name": "com.sun.org.apache.xerces.internal.impl.xpath.regex.message", + "locales": [ + "en-SG", + "und" + ] + } + ], + "jni": [ + { + "type": "java.lang.Boolean", + "methods": [ + { + "name": "getBoolean", + "parameterTypes": [ + "java.lang.String" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/gbcs-native/native-image/reflect-config.json b/gbcs-native/native-image/reflect-config.json new file mode 100644 index 0000000..e9c36e1 --- /dev/null +++ b/gbcs-native/native-image/reflect-config.json @@ -0,0 +1,330 @@ +[ +{ + "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.joran.SerializedModelConfigurator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.util.DefaultJoranConfigurator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.ConsoleAppender", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }, {"name":"setTarget","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.OutputStreamAppender", + "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.Encoder", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods":[{"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }] +}, +{ + "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.spi.ContextAware", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.sun.crypto.provider.AESCipher$General", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.ARCFOURCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.DESCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.DESedeCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.impl.dv.xs.ExtendedSchemaDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.impl.dv.xs.SchemaDVFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"io.netty.bootstrap.ServerBootstrap$1" +}, +{ + "name":"io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor", + "methods":[{"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }] +}, +{ + "name":"io.netty.buffer.AbstractByteBufAllocator", + "queryAllDeclaredMethods":true +}, +{ + "name":"io.netty.channel.AbstractChannelHandlerContext", + "fields":[{"name":"handlerState"}] +}, +{ + "name":"io.netty.channel.ChannelInboundHandlerAdapter", + "methods":[{"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] +}, +{ + "name":"io.netty.channel.ChannelInitializer", + "methods":[{"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }] +}, +{ + "name":"io.netty.channel.ChannelOutboundBuffer", + "fields":[{"name":"totalPendingSize"}, {"name":"unwritable"}] +}, +{ + "name":"io.netty.channel.DefaultChannelConfig", + "fields":[{"name":"autoRead"}, {"name":"writeBufferWaterMark"}] +}, +{ + "name":"io.netty.channel.DefaultChannelPipeline", + "fields":[{"name":"estimatorHandle"}] +}, +{ + "name":"io.netty.channel.DefaultChannelPipeline$HeadContext", + "methods":[{"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }] +}, +{ + "name":"io.netty.channel.DefaultChannelPipeline$TailContext", + "methods":[{"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] +}, +{ + "name":"io.netty.channel.socket.nio.NioServerSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"io.netty.util.DefaultAttributeMap", + "fields":[{"name":"attributes"}] +}, +{ + "name":"io.netty.util.concurrent.DefaultPromise", + "fields":[{"name":"result"}] +}, +{ + "name":"io.netty.util.concurrent.SingleThreadEventExecutor", + "fields":[{"name":"state"}, {"name":"threadProperties"}] +}, +{ + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields":[{"name":"producerLimit"}] +}, +{ + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields":[{"name":"consumerIndex"}] +}, +{ + "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields":[{"name":"producerIndex"}] +}, +{ + "name":"java.io.FilePermission" +}, +{ + "name":"java.lang.ProcessHandle", + "methods":[{"name":"current","parameterTypes":[] }, {"name":"pid","parameterTypes":[] }] +}, +{ + "name":"java.lang.RuntimePermission" +}, +{ + "name":"java.lang.Thread", + "fields":[{"name":"threadLocalRandomProbe"}] +}, +{ + "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":"MAX_MEMORY"}, {"name":"UNALIGNED"}] +}, +{ + "name":"java.nio.Buffer", + "fields":[{"name":"address"}] +}, +{ + "name":"java.nio.ByteBuffer", + "methods":[{"name":"alignedSlice","parameterTypes":["int"] }] +}, +{ + "name":"java.nio.DirectByteBuffer", + "methods":[{"name":"","parameterTypes":["long","long"] }] +}, +{ + "name":"java.nio.channels.spi.SelectorProvider", + "methods":[{"name":"openServerSocketChannel","parameterTypes":["java.net.ProtocolFamily"] }] +}, +{ + "name":"java.security.AlgorithmParametersSpi" +}, +{ + "name":"java.security.AllPermission" +}, +{ + "name":"java.security.KeyStoreSpi" +}, +{ + "name":"java.security.SecureRandomParameters" +}, +{ + "name":"java.security.SecurityPermission" +}, +{ + "name":"java.util.PropertyPermission" +}, +{ + "name":"java.util.concurrent.ForkJoinTask", + "fields":[{"name":"aux"}, {"name":"status"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicBoolean", + "fields":[{"name":"value"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicReference", + "fields":[{"name":"value"}] +}, +{ + "name":"java.util.concurrent.atomic.Striped64", + "fields":[{"name":"base"}, {"name":"cellsBusy"}] +}, +{ + "name":"javax.security.auth.x500.X500Principal", + "fields":[{"name":"thisX500Name"}], + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "name":"javax.smartcardio.CardPermission" +}, +{ + "name":"jdk.internal.misc.Unsafe", + "methods":[{"name":"getUnsafe","parameterTypes":[] }] +}, +{ + "name":"sun.misc.Unsafe", + "fields":[{"name":"theUnsafe"}], + "methods":[{"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] }, {"name":"getAndAddLong","parameterTypes":["java.lang.Object","long","long"] }, {"name":"getAndSetObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, {"name":"invokeCleaner","parameterTypes":["java.nio.ByteBuffer"] }, {"name":"storeFence","parameterTypes":[] }] +}, +{ + "name":"sun.nio.ch.SelectorImpl", + "fields":[{"name":"publicSelectedKeys"}, {"name":"selectedKeys"}] +}, +{ + "name":"sun.security.pkcs12.PKCS12KeyStore", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.JavaKeyStore$JKS", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.SSLContextImpl$DefaultSSLContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.x509.AuthorityInfoAccessExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CRLDistributionPointsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CertificatePoliciesExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.KeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.NetscapeCertTypeExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.PrivateKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +} +] diff --git a/gbcs-native/native-image/resource-config.json b/gbcs-native/native-image/resource-config.json new file mode 100644 index 0000000..8336111 --- /dev/null +++ b/gbcs-native/native-image/resource-config.json @@ -0,0 +1,40 @@ +{ + "resources":{ + "includes":[{ + "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" + }, { + "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E" + }, { + "pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E" + }, { + "pattern":"\\QMETA-INF/services/java.nio.channels.spi.SelectorProvider\\E" + }, { + "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E" + }, { + "pattern":"\\QMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory\\E" + }, { + "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E" + }, { + "pattern":"\\QMETA-INF/services/net.woggioni.gbcs.api.CacheProvider\\E" + }, { + "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" + }, { + "pattern":"\\Qclasspath:net/woggioni/gbcs/graal/logback.xml\\E" + }, { + "pattern":"\\Qlogback-test.scmo\\E" + }, { + "pattern":"\\Qlogback.scmo\\E" + }, { + "pattern":"\\Qnet/woggioni/gbcs/graal/logback.xml\\E" + }, { + "pattern":"\\Qnet/woggioni/gbcs/server/memcache/schema/gbcs-memcache.xsd\\E" + }, { + "pattern":"\\Qnet/woggioni/gbcs/server/schema/gbcs.xsd\\E" + }]}, + "bundles":[{ + "name":"com.sun.org.apache.xerces.internal.impl.xpath.regex.message", + "locales":[""] + }, { + "name": "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages" + }] +} diff --git a/gbcs-native/native-image/serialization-config.json b/gbcs-native/native-image/serialization-config.json new file mode 100644 index 0000000..f3d7e06 --- /dev/null +++ b/gbcs-native/native-image/serialization-config.json @@ -0,0 +1,8 @@ +{ + "types":[ + ], + "lambdaCapturingTypes":[ + ], + "proxies":[ + ] +} diff --git a/gbcs-native/src/main/java/net/woggioni/gbcs/graal/ConfigureNativeServer.java b/gbcs-native/src/main/java/net/woggioni/gbcs/graal/ConfigureNativeServer.java new file mode 100644 index 0000000..02b7d1c --- /dev/null +++ b/gbcs-native/src/main/java/net/woggioni/gbcs/graal/ConfigureNativeServer.java @@ -0,0 +1,10 @@ +package net.woggioni.gbcs.graal; + +import java.time.Duration; + +public class ConfigureNativeServer { + + public static void main(String[] args) throws Exception { + NativeServer.run(Duration.ofSeconds(60)); + } +} diff --git a/gbcs-native/src/main/java/net/woggioni/gbcs/graal/NativeServer.java b/gbcs-native/src/main/java/net/woggioni/gbcs/graal/NativeServer.java new file mode 100644 index 0000000..856dbe6 --- /dev/null +++ b/gbcs-native/src/main/java/net/woggioni/gbcs/graal/NativeServer.java @@ -0,0 +1,45 @@ +package net.woggioni.gbcs.graal; + +import net.woggioni.gbcs.server.GradleBuildCacheServer; +import net.woggioni.jwo.Application; + +import java.nio.file.Path; +import java.time.Duration; + +public class NativeServer { + + private static Path findConfigurationFile(Application app, String fileName) { + final var confDir = app.computeConfigurationDirectory(); + final var configurationFile = confDir.resolve(fileName); + return configurationFile; + } + + static void run(Duration timeout) throws Exception { + final var app = Application.builder("gbcs") + .configurationDirectoryEnvVar("GBCS_CONFIGURATION_DIR") + .configurationDirectoryPropertyKey("net.woggioni.gbcs.conf.dir") + .build(); + + final var configurationFile = findConfigurationFile(app, "gbcs-server.xml"); + final var cfg = GradleBuildCacheServer.Companion.loadConfiguration(configurationFile); + try(final var handle = new GradleBuildCacheServer(cfg).run()) { + if(timeout != null) { + Thread.sleep(timeout); + handle.shutdown(); + } + } + } + + private static void setPropertyIfNotPresent(String key, String value) { + final var previousValue = System.getProperty(key); + if(previousValue == null) { + System.setProperty(key, value); + } + } + + public static void main(String[] args) throws Exception { + setPropertyIfNotPresent("logback.configurationFile", "net/woggioni/gbcs/graal/logback.xml"); + setPropertyIfNotPresent("io.netty.leakDetectionLevel", "DISABLED"); + run(null); + } +} diff --git a/gbcs-native/src/main/resources/net/woggioni/gbcs/graal/logback.xml b/gbcs-native/src/main/resources/net/woggioni/gbcs/graal/logback.xml new file mode 100644 index 0000000..a13d99e --- /dev/null +++ b/gbcs-native/src/main/resources/net/woggioni/gbcs/graal/logback.xml @@ -0,0 +1,18 @@ + + + + + + + + + System.err + + %d [%highlight(%-5level)] \(%thread\) %logger{36} -%kvp- %msg %n + + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index d05c61c..7d9a660 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,10 @@ pluginManagement { repositories { + mavenLocal { + content { + includeGroup 'net.woggioni.gradle' + } + } maven { url = getProperty('gitea.maven.url') } @@ -32,3 +37,4 @@ include 'gbcs-cli' include 'docker' include 'gbcs-client' include 'gbcs-server' +include 'gbcs-native'