You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2020/12/22 02:42:58 UTC

[cxf] branch master updated: CXF-8340: GraalVM native image fails to run. Added sample JAX-RS projects, minor fixes

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new 78f8ebd  CXF-8340: GraalVM native image fails to run. Added sample JAX-RS projects, minor fixes
78f8ebd is described below

commit 78f8ebdc73123e0b5a21fcb2443c4c92f3527868
Author: reta <dr...@gmail.com>
AuthorDate: Mon Dec 21 21:41:38 2020 -0500

    CXF-8340: GraalVM native image fails to run. Added sample JAX-RS projects, minor fixes
---
 .../samples/jax_rs/graalvm_basic/README.txt        | 115 ++++
 .../samples/jax_rs/graalvm_basic/bin/.gitignore    |   4 +
 .../graalvm_basic}/pom.xml                         |  62 +--
 .../src/graalvm/client/jni-config.json             |  22 +
 .../src/graalvm/client/proxy-config.json           |   2 +
 .../src/graalvm/client/reflect-config.json         | 289 ++++++++++
 .../src/graalvm/client/resource-config.json        |  36 ++
 .../src/graalvm/server/jni-config.json             |  22 +
 .../src/graalvm/server/proxy-config.json           |   3 +
 .../src/graalvm/server/reflect-config.json         | 586 +++++++++++++++++++++
 .../src/graalvm/server/resource-config.json        |  40 ++
 .../src/main/java/demo/jaxrs/client/Client.java    |  84 +++
 .../src/main/java/demo/jaxrs/server/Customer.java  |  43 ++
 .../java/demo/jaxrs/server/CustomerService.java    | 116 ++++
 .../src/main/java/demo/jaxrs/server/Order.java     |  68 +++
 .../src/main/java/demo/jaxrs/server/Product.java   |  43 ++
 .../src/main/java/demo/jaxrs/server/Server.java    |  45 ++
 .../jax_rs_graalvm_basic/native-image.properties   |   1 +
 .../src/main/resources/add_customer.xml            |   4 +
 .../src/main/resources/update_customer.xml         |   5 +
 .../main/release/samples/jaxws_graalvm/README.txt  |  18 +-
 .../release/samples/jaxws_graalvm/bin/.gitignore   |   4 +
 .../src/main/release/samples/jaxws_graalvm/pom.xml |   2 +
 .../samples/jaxws_graalvm_dynamic/README.txt       |   2 +-
 distribution/src/main/release/samples/pom.xml      |   1 +
 25 files changed, 1566 insertions(+), 51 deletions(-)

diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/README.txt b/distribution/src/main/release/samples/jax_rs/graalvm_basic/README.txt
new file mode 100644
index 0000000..06f7311
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/README.txt
@@ -0,0 +1,115 @@
+JAX-RS GraalVM native-image Demo 
+=================
+
+This demo shows how JAX-RS services and clients could use GraalVM's native-image 
+capabilities and be packaged as native executables. The REST server provides the 
+following services: 
+
+A RESTful customer service is provided on URL http://localhost:9000/customers. 
+Users access this URI to operate on customer.
+
+A HTTP GET request to URL http://localhost:9000/customerservice/customers/123
+returns a customer instance whose id is 123. The XML document returned:
+
+<Customer>
+  <id>123</id>
+  <name>John</name>
+</Customer>
+
+A HTTP GET request to URL http://localhost:9000/customerservice/orders/223/products/323
+returns product 323 that belongs to order 223. The XML document returned:
+
+<Product>
+  <description>product 323</description> 
+  <id>323</id> 
+</Product>
+
+A HTTP POST request to URL http://localhost:9000/customerservice/customers
+with the data:
+
+<Customer>
+  <name>Jack</name>
+</Customer>
+
+adds a customer whose name is Jack 
+
+
+A HTTP PUT request to URL http://localhost:9000/customerservice/customers
+with the data:
+
+<Customer>
+  <id>123</id>
+  <name>John</name>
+</Customer>
+
+updates the customer instance whose id is 123
+
+
+The client code demonstrates how to send HTTP GET/POST/PUT/DELETE request. The 
+server code demonstrates how to build a RESTful endpoint through 
+JAX-RS (JSR-311) APIs.
+
+Pre-requisites
+---------------------------------------
+
+GraalVM 20.3.0 or later distribution should be installed and pre-configured as 
+default JVM runtime (using JAVA_HOME), see please instructions at [1].
+
+The GraalVM's native-image tool should be installed, see please 
+instructions at [2].
+
+Building and running the demo using Maven
+---------------------------------------
+
+From the base directory of this sample (i.e., where this README file is
+located), the maven pom.xml file can be used to build and run the demo. 
+
+Using either UNIX or Windows, build server:  
+  
+  mvn clean package -Pserver  (from one command line window)
+  
+This goal will produce 'target/jaxrs-demo-server' executable (platform-dependent) 
+which could be run right away: 
+
+  On Windows: bin\jaxrs-demo-server.exe
+  On Linux: ./bin/jaxrs-demo-server
+
+Than build client:
+  
+  mvn clean package -Pclient  (from a second command line window)
+
+This goal will produce 'target/jaxrs-demo-client' executable (platform-dependent) 
+which could be run right away: 
+
+  On Windows: bin\jaxrs-demo-client.exe
+  On Linux: ./bin/jaxrs-demo-client
+
+The command should produce the following output (assuming the server is up and running):
+
+  Sent HTTP GET request to query customer info
+  <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Customer><id>123</id><name>Mary</name></Customer>
+
+
+  Sent HTTP GET request to query sub resource product info
+  <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Product><description>product 323</description><id>323</id></Product>
+
+
+  Sent HTTP PUT request to update customer info
+  Response status code: 200
+  Response body: 
+
+
+
+  Sent HTTP POST request to add customer
+  Response status code: 200
+  Response body: 
+  <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Customer><id>128</id><name>Jack</name></Customer>
+
+To remove the target dir, run mvn clean".
+
+References
+---------------------------------------
+[1] https://www.graalvm.org/downloads/
+[2] https://www.graalvm.org/reference-manual/native-image/ 
+
+
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/bin/.gitignore b/distribution/src/main/release/samples/jax_rs/graalvm_basic/bin/.gitignore
new file mode 100644
index 0000000..86d0cb2
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/bin/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
diff --git a/distribution/src/main/release/samples/jaxws_graalvm/pom.xml b/distribution/src/main/release/samples/jax_rs/graalvm_basic/pom.xml
similarity index 80%
copy from distribution/src/main/release/samples/jaxws_graalvm/pom.xml
copy to distribution/src/main/release/samples/jax_rs/graalvm_basic/pom.xml
index d0c4fe7..b224923 100644
--- a/distribution/src/main/release/samples/jaxws_graalvm/pom.xml
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/pom.xml
@@ -19,44 +19,19 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>jaxws_graalvm</artifactId>
-    <name>JAX-WS GraalVM Demo</name>
-    <description>JAX-WS GraalVM Demo</description>
+    <artifactId>jax_rs_graalvm_basic</artifactId>
+    <name>JAX-RS Basic Demo</name>
+    <description>JAX-RS Basic Demo</description>
     <parent>
         <groupId>org.apache.cxf.samples</groupId>
         <artifactId>cxf-samples</artifactId>
         <version>3.5.0-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
     </parent>
-    <properties>
+     <properties>
         <cxf.version>${project.version}</cxf.version>
-        <wsdl.file>${basedir}/src/main/resources/addNumbers.wsdl</wsdl.file>
         <graalvm.version>20.3.0</graalvm.version>
     </properties>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.cxf</groupId>
-                <artifactId>cxf-codegen-plugin</artifactId>
-                <version>${project.version}</version>
-                <executions>
-                    <execution>
-                        <id>generate-SOAPService1</id>
-                        <phase>generate-sources</phase>
-                        <configuration>
-                            <wsdlOptions>
-                                <wsdlOption>
-                                    <wsdl>${wsdl.file}</wsdl>
-                                </wsdlOption>
-                            </wsdlOptions>
-                        </configuration>
-                        <goals>
-                            <goal>wsdl2java</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
     <profiles>
         <profile>
             <id>server</id>
@@ -79,7 +54,7 @@
                                     <goal>copy-resources</goal>
                                 </goals>
                                 <configuration>
-                                    <outputDirectory>${project.build.outputDirectory}/META-INF/native-image/org.apache.cxf.samples/jaxws_graalvm</outputDirectory>
+                                    <outputDirectory>${project.build.outputDirectory}/META-INF/native-image/org.apache.cxf.samples/jax_rs_graalvm_basic</outputDirectory>
                                     <resources>
                                         <resource>
                                             <directory>src/graalvm/server</directory>
@@ -103,9 +78,10 @@
                             </execution>
                         </executions>
                         <configuration>
-                            <mainClass>demo.jaxws.server.Server</mainClass>
-                            <imageName>jaxws-demo-server</imageName>
+                            <mainClass>demo.jaxrs.server.Server</mainClass>
+                            <imageName>jaxrs-demo-server</imageName>
                             <buildArgs>--no-fallback</buildArgs>
+                            <outputDirectory>${basedir}/bin</outputDirectory>
                         </configuration>
                     </plugin>
                 </plugins>
@@ -118,6 +94,10 @@
                     <groupId>org.apache.cxf</groupId>
                     <artifactId>cxf-rt-transports-http-netty-client</artifactId>
                 </dependency>
+                <dependency>
+                    <groupId>org.apache.cxf</groupId>
+                    <artifactId>cxf-rt-rs-client</artifactId>
+                </dependency>
             </dependencies>
             <build>
                 <plugins>
@@ -132,7 +112,7 @@
                                     <goal>copy-resources</goal>
                                 </goals>
                                 <configuration>
-                                    <outputDirectory>${project.build.outputDirectory}/META-INF/native-image/org.apache.cxf.samples/jaxws_graalvm</outputDirectory>
+                                    <outputDirectory>${project.build.outputDirectory}/META-INF/native-image/org.apache.cxf.samples/jax_rs_graalvm_basic</outputDirectory>
                                     <resources>
                                         <resource>
                                             <directory>src/graalvm/client</directory>
@@ -156,24 +136,28 @@
                             </execution>
                         </executions>
                         <configuration>
-                            <mainClass>demo.jaxws.client.Client</mainClass>
-                            <imageName>jaxws-demo-client</imageName>
+                            <mainClass>demo.jaxrs.client.Client</mainClass>
+                            <imageName>jaxrs-demo-client</imageName>
                             <buildArgs>--no-fallback</buildArgs>
+                            <outputDirectory>${basedir}/bin</outputDirectory>
                         </configuration>
                     </plugin>
                 </plugins>
             </build>
         </profile>
     </profiles>
-
     <dependencies>
         <dependency>
             <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-frontend-jaxws</artifactId>
+            <artifactId>cxf-rt-transports-http</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-transports-http</artifactId>
+            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
         </dependency>
     </dependencies>
 </project>
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/jni-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/jni-config.json
new file mode 100644
index 0000000..0218ccb
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/jni-config.json
@@ -0,0 +1,22 @@
+[
+{
+  "name":"java.lang.ClassLoader",
+  "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.NoSuchMethodError"
+},
+{
+  "name":"sun.management.VMManagementImpl",
+  "fields":[
+    {"name":"compTimeMonitoringSupport"}, 
+    {"name":"currentThreadCpuTimeSupport"}, 
+    {"name":"objectMonitorUsageSupport"}, 
+    {"name":"otherThreadCpuTimeSupport"}, 
+    {"name":"remoteDiagnosticCommandsSupport"}, 
+    {"name":"synchronizerUsageSupport"}, 
+    {"name":"threadAllocatedMemorySupport"}, 
+    {"name":"threadContentionMonitoringSupport"}
+  ]
+}
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/proxy-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/proxy-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/proxy-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/reflect-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/reflect-config.json
new file mode 100644
index 0000000..3dd0d51
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/reflect-config.json
@@ -0,0 +1,289 @@
+[
+{
+  "name":"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"io.netty.channel.socket.nio.NioSocketChannel",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.lang.Object",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.lang.invoke.MethodHandles",
+  "methods":[{"name":"lookup","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.invoke.MethodHandles$Lookup",
+  "methods":[{"name":"findClass","parameterTypes":["java.lang.String"] }]
+},
+{
+  "name":"java.lang.management.ManagementFactory",
+  "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.management.RuntimeMXBean",
+  "methods":[{"name":"getInputArguments","parameterTypes":[] }]
+},
+{
+  "name":"java.net.Authenticator",
+  "methods":[{"name":"getDefault","parameterTypes":[] }]
+},
+{
+  "name":"java.nio.Bits",
+  "fields":[{"name":"UNALIGNED"}]
+},
+{
+  "name":"java.nio.Buffer",
+  "fields":[{"name":"address", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.nio.DirectByteBuffer",
+  "methods":[{"name":"<init>","parameterTypes":["long","int"] }]
+},
+{
+  "name":"java.security.MessageDigestSpi"
+},
+{
+  "name":"java.security.SecureRandomParameters"
+},
+{
+  "name":"javax.annotation.Priority",
+  "methods":[{"name":"value","parameterTypes":[] }]
+},
+{
+  "name":"javax.security.auth.login.Configuration"
+},
+{
+  "name":"javax.ws.rs.ext.MessageBodyReader",
+  "allPublicMethods":true
+},
+{
+  "name":"javax.ws.rs.ext.MessageBodyWriter",
+  "allPublicMethods":true
+},
+{
+  "name":"javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter"
+},
+{
+  "name":"jdk.internal.misc.Unsafe",
+  "methods":[{"name":"getUnsafe","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.binding.AbstractBindingFactory",
+  "fields":[{"name":"bus"}]
+},
+{
+  "name":"org.apache.cxf.bus.CXFBusFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.CXFBusLifeCycleManager",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.ClientLifeCycleManagerImpl",
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.EndpointResolverRegistryImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.HeaderManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.PhaseManagerImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.ServerLifeCycleManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.ServerRegistryImpl",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.WorkQueueManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.resource.ResourceManagerImpl"
+},
+{
+  "name":"org.apache.cxf.buslifecycle.BusLifeCycleManager"
+},
+{
+  "name":"org.apache.cxf.catalog.OASISCatalogManager"
+},
+{
+  "name":"org.apache.cxf.common.spi.ClassLoaderProxyService"
+},
+{
+  "name":"org.apache.cxf.common.util.ASMHelperImpl"
+},
+{
+  "name":"org.apache.cxf.endpoint.ClientLifeCycleManager"
+},
+{
+  "name":"org.apache.cxf.endpoint.ServerRegistry"
+},
+{
+  "name":"org.apache.cxf.ext.logging.LoggingBusLifecycleListener",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.ext.logging.LoggingFactoryBeanListener"
+},
+{
+  "name":"org.apache.cxf.ext.logging.OldLoggingFactoryBeanListener"
+},
+{
+  "name":"org.apache.cxf.jaxrs.JAXRSBindingFactory",
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.AbstractJAXBProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.BinaryDataProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.DataSourceProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.FormEncodingProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.JAXBElementProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.MultipartProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.PrimitiveTextProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.SourceProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.StringTextProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.phase.PhaseManager"
+},
+{
+  "name":"org.apache.cxf.service.factory.FactoryBeanListenerManager"
+},
+{
+  "name":"org.apache.cxf.transport.AbstractTransportFactory",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"org.apache.cxf.transport.http.HTTPTransportFactory",
+  "fields":[{"name":"DEFAULT_NAMESPACES"}],
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.transport.http.ReferencingAuthenticator",
+  "methods":[{"name":"<init>","parameterTypes":["java.net.Authenticator","java.net.Authenticator"] }]
+},
+{
+  "name":"org.apache.cxf.transport.http.netty.client.NettyHttpConduitFactory",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.slf4j.LoggerFactory",
+  "methods":[{"name":"getILoggerFactory","parameterTypes":[] }]
+},
+{
+  "name":"org.slf4j.impl.StaticLoggerBinder"
+},
+{
+  "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":"sun.nio.ch.SelectorImpl",
+  "fields":[
+    {"name":"publicSelectedKeys", "allowUnsafeAccess":true}, 
+    {"name":"selectedKeys", "allowUnsafeAccess":true}
+  ]
+},
+{
+  "name":"sun.security.provider.DRBG",
+  "methods":[{"name":"<init>","parameterTypes":["java.security.SecureRandomParameters"] }]
+},
+{
+  "name":"sun.security.provider.SHA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA2$SHA256",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/resource-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/resource-config.json
new file mode 100644
index 0000000..a406f3f
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/client/resource-config.json
@@ -0,0 +1,36 @@
+{
+  "resources":{
+  "includes":[
+    {"pattern":"\\QMETA-INF/cxf/bus-extensions.txt\\E"}, 
+    {"pattern":"\\QMETA-INF/io.netty.versions.properties\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.ws.rs.client.ClientBuilder\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.ws.rs.ext.RuntimeDelegate\\E"}, 
+    {"pattern":"\\QMETA-INF/services/org.apache.cxf.bus.factory\\E"}, 
+    {"pattern":"\\Qadd_customer.xml\\E"}, 
+    {"pattern":"\\Qorg/apache/cxf/transport/http/ReferencingAuthenticator.class\\E"}, 
+    {"pattern":"\\Qorg/apache/cxf/version/version.properties\\E"}, 
+    {"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"}, 
+    {"pattern":"\\Qupdate_customer.xml\\E"}
+  ]},
+  "bundles":[
+    {"name":"org.apache.cxf.Messages"}, 
+    {"name":"org.apache.cxf.bus.extension.Messages"}, 
+    {"name":"org.apache.cxf.bus.managers.Messages"}, 
+    {"name":"org.apache.cxf.common.annotation.Messages"}, 
+    {"name":"org.apache.cxf.common.injection.Messages"}, 
+    {"name":"org.apache.cxf.common.util.Messages"}, 
+    {"name":"org.apache.cxf.endpoint.Messages"}, 
+    {"name":"org.apache.cxf.interceptor.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.client.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.impl.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.interceptor.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.provider.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.utils.Messages"}, 
+    {"name":"org.apache.cxf.resource.Messages"}, 
+    {"name":"org.apache.cxf.service.factory.Messages"}, 
+    {"name":"org.apache.cxf.service.model.Messages"}, 
+    {"name":"org.apache.cxf.transport.http.Messages"}, 
+    {"name":"org.apache.cxf.transport.https.Messages"}
+  ]
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/jni-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/jni-config.json
new file mode 100644
index 0000000..0218ccb
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/jni-config.json
@@ -0,0 +1,22 @@
+[
+{
+  "name":"java.lang.ClassLoader",
+  "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.NoSuchMethodError"
+},
+{
+  "name":"sun.management.VMManagementImpl",
+  "fields":[
+    {"name":"compTimeMonitoringSupport"}, 
+    {"name":"currentThreadCpuTimeSupport"}, 
+    {"name":"objectMonitorUsageSupport"}, 
+    {"name":"otherThreadCpuTimeSupport"}, 
+    {"name":"remoteDiagnosticCommandsSupport"}, 
+    {"name":"synchronizerUsageSupport"}, 
+    {"name":"threadAllocatedMemorySupport"}, 
+    {"name":"threadContentionMonitoringSupport"}
+  ]
+}
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/proxy-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/proxy-config.json
new file mode 100644
index 0000000..ed259d4
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/proxy-config.json
@@ -0,0 +1,3 @@
+[
+  ["com.sun.xml.bind.marshaller.CharacterEscapeHandler"]
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/reflect-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/reflect-config.json
new file mode 100644
index 0000000..33d0704
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/reflect-config.json
@@ -0,0 +1,586 @@
+[
+{
+  "name":"char[]"
+},
+{
+  "name":"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"com.sun.xml.bind.marshaller.CharacterEscapeHandler",
+  "allPublicMethods":true
+},
+{
+  "name":"com.sun.xml.bind.marshaller.MinimumEscapeHandler",
+  "fields":[{"name":"theInstance"}]
+},
+{
+  "name":"com.sun.xml.bind.v2.model.nav.ReflectionNavigator",
+  "methods":[{"name":"getInstance","parameterTypes":[] }]
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.ArrayElementLeafProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.SingleMapNodeProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty",
+  "allPublicConstructors":true
+},
+{
+  "name":"com.sun.xml.bind.v2.runtime.unmarshaller.StAXExConnector",
+  "methods":[{"name":"<init>","parameterTypes":["org.jvnet.staxex.XMLStreamReaderEx","com.sun.xml.bind.v2.runtime.unmarshaller.XmlVisitor"] }]
+},
+{
+  "name":"demo.jaxrs.server.Customer",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"demo.jaxrs.server.CustomerService",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"demo.jaxrs.server.Order",
+  "allPublicMethods":true
+},
+{
+  "name":"demo.jaxrs.server.Product",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "methods":[{"name":"<init>","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",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.buffer.AbstractReferenceCountedByteBuf",
+  "fields":[{"name":"refCnt", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.channel.ChannelDuplexHandler",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"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":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.channel.ChannelHandlerAdapter",
+  "methods":[{"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }]
+},
+{
+  "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":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, 
+    {"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.ChannelOutboundHandlerAdapter",
+  "methods":[
+    {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, 
+    {"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":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "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.embedded.EmbeddedChannel$2"
+},
+{
+  "name":"io.netty.channel.socket.nio.NioServerSocketChannel",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"io.netty.handler.codec.ByteToMessageDecoder",
+  "methods":[
+    {"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":"io.netty.handler.codec.MessageAggregator",
+  "methods":[
+    {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }
+  ]
+},
+{
+  "name":"io.netty.handler.codec.MessageToByteEncoder",
+  "methods":[{"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }]
+},
+{
+  "name":"io.netty.handler.codec.MessageToMessageCodec",
+  "methods":[
+    {"name":"channelRead","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.handler.codec.MessageToMessageDecoder",
+  "methods":[{"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }]
+},
+{
+  "name":"io.netty.handler.codec.MessageToMessageEncoder",
+  "methods":[{"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }]
+},
+{
+  "name":"io.netty.handler.codec.compression.JdkZlibEncoder",
+  "methods":[{"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }]
+},
+{
+  "name":"io.netty.handler.codec.http.HttpContentCompressor"
+},
+{
+  "name":"io.netty.handler.codec.http.HttpContentEncoder",
+  "methods":[{"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }]
+},
+{
+  "name":"io.netty.handler.codec.http.HttpObjectAggregator"
+},
+{
+  "name":"io.netty.handler.codec.http.HttpObjectDecoder",
+  "methods":[{"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }]
+},
+{
+  "name":"io.netty.handler.codec.http.HttpRequestDecoder"
+},
+{
+  "name":"io.netty.handler.codec.http.HttpResponseEncoder"
+},
+{
+  "name":"io.netty.handler.timeout.IdleStateHandler",
+  "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":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] }
+  ]
+},
+{
+  "name":"io.netty.util.ReferenceCountUtil",
+  "allDeclaredMethods":true
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField",
+  "fields":[{"name":"consumerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField",
+  "fields":[{"name":"producerIndex", "allowUnsafeAccess":true}]
+},
+{
+  "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField",
+  "fields":[{"name":"producerLimit", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.io.Writer"
+},
+{
+  "name":"java.lang.Object",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"java.lang.management.ManagementFactory",
+  "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+  "name":"java.lang.management.RuntimeMXBean",
+  "methods":[
+    {"name":"getInputArguments","parameterTypes":[] }, 
+    {"name":"getName","parameterTypes":[] }
+  ]
+},
+{
+  "name":"java.nio.Bits",
+  "fields":[{"name":"UNALIGNED"}]
+},
+{
+  "name":"java.nio.Buffer",
+  "fields":[{"name":"address", "allowUnsafeAccess":true}]
+},
+{
+  "name":"java.nio.DirectByteBuffer",
+  "methods":[{"name":"<init>","parameterTypes":["long","int"] }]
+},
+{
+  "name":"java.security.MessageDigestSpi"
+},
+{
+  "name":"java.security.SecureRandomParameters"
+},
+{
+  "name":"javax.annotation.Priority",
+  "methods":[{"name":"value","parameterTypes":[] }]
+},
+{
+  "name":"javax.security.auth.login.Configuration"
+},
+{
+  "name":"javax.ws.rs.ext.ExceptionMapper",
+  "allPublicMethods":true
+},
+{
+  "name":"javax.ws.rs.ext.MessageBodyReader",
+  "allPublicMethods":true
+},
+{
+  "name":"javax.ws.rs.ext.MessageBodyWriter",
+  "allPublicMethods":true
+},
+{
+  "name":"javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter"
+},
+{
+  "name":"jdk.internal.misc.Unsafe",
+  "methods":[{"name":"getUnsafe","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.binding.AbstractBindingFactory",
+  "fields":[{"name":"bus"}]
+},
+{
+  "name":"org.apache.cxf.bus.CXFBusFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.CXFBusLifeCycleManager",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.ClientLifeCycleManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.EndpointResolverRegistryImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.HeaderManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.managers.PhaseManagerImpl",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.ServerLifeCycleManagerImpl",
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.ServerRegistryImpl",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.bus.managers.WorkQueueManagerImpl"
+},
+{
+  "name":"org.apache.cxf.bus.resource.ResourceManagerImpl"
+},
+{
+  "name":"org.apache.cxf.buslifecycle.BusLifeCycleManager"
+},
+{
+  "name":"org.apache.cxf.catalog.OASISCatalogManager"
+},
+{
+  "name":"org.apache.cxf.common.spi.ClassLoaderProxyService"
+},
+{
+  "name":"org.apache.cxf.common.util.ASMHelperImpl"
+},
+{
+  "name":"org.apache.cxf.endpoint.ServerLifeCycleManager"
+},
+{
+  "name":"org.apache.cxf.endpoint.ServerRegistry"
+},
+{
+  "name":"org.apache.cxf.ext.logging.LoggingBusLifecycleListener",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.ext.logging.LoggingFactoryBeanListener",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.ext.logging.OldLoggingFactoryBeanListener",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.JAXRSBindingFactory",
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.nio.NioMessageBodyWriter",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.AbstractConfigurableProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.AbstractJAXBProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.BinaryDataProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.DataSourceProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.FormEncodingProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.JAXBElementProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.JAXBElementTypedProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.MultipartProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.PrimitiveTextProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.SourceProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.jaxrs.provider.StringTextProvider",
+  "allDeclaredFields":true,
+  "allPublicMethods":true
+},
+{
+  "name":"org.apache.cxf.phase.PhaseManager"
+},
+{
+  "name":"org.apache.cxf.service.factory.FactoryBeanListenerManager",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.transport.AbstractTransportFactory",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true
+},
+{
+  "name":"org.apache.cxf.transport.http.HTTPTransportFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.transport.http.netty.server.NettyHttpDestinationFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.cxf.transport.http.netty.server.NettyHttpServerEngineFactory",
+  "fields":[{"name":"bus"}],
+  "methods":[{"name":"<init>","parameterTypes":["org.apache.cxf.Bus"] }]
+},
+{
+  "name":"org.apache.cxf.transport.http.netty.server.NettyHttpServletHandler",
+  "methods":[
+    {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, 
+    {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, 
+    {"name":"channelReadComplete","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":"org.apache.cxf.transport.http.netty.server.NettyHttpServletPipelineFactory"
+},
+{
+  "name":"org.apache.cxf.transport.http.netty.server.NettyHttpTransportFactory",
+  "allDeclaredFields":true,
+  "allDeclaredMethods":true,
+  "allPublicMethods":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.jvnet.staxex.XMLStreamReaderEx"
+},
+{
+  "name":"org.slf4j.LoggerFactory",
+  "methods":[{"name":"getILoggerFactory","parameterTypes":[] }]
+},
+{
+  "name":"org.slf4j.impl.StaticLoggerBinder"
+},
+{
+  "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":"sun.nio.ch.SelectorImpl",
+  "fields":[
+    {"name":"publicSelectedKeys", "allowUnsafeAccess":true}, 
+    {"name":"selectedKeys", "allowUnsafeAccess":true}
+  ]
+},
+{
+  "name":"sun.security.provider.DRBG",
+  "methods":[{"name":"<init>","parameterTypes":["java.security.SecureRandomParameters"] }]
+},
+{
+  "name":"sun.security.provider.SHA",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.SHA2$SHA256",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+}
+]
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/resource-config.json b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/resource-config.json
new file mode 100644
index 0000000..460b9e3
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/graalvm/server/resource-config.json
@@ -0,0 +1,40 @@
+{
+  "resources":{
+  "includes":[
+    {"pattern":"\\QMETA-INF/cxf/bus-extensions.txt\\E"}, 
+    {"pattern":"\\QMETA-INF/io.netty.versions.properties\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.ws.rs.ext.RuntimeDelegate\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.xml.bind.JAXBContextFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.xml.stream.XMLInputFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/services/javax.xml.stream.XMLOutputFactory\\E"}, 
+    {"pattern":"\\QMETA-INF/services/org.apache.cxf.bus.factory\\E"}, 
+    {"pattern":"\\Qorg/apache/cxf/version/version.properties\\E"}, 
+    {"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"}
+  ]},
+  "bundles":[
+    {"name":"javax.servlet.LocalStrings"}, 
+    {"name":"org.apache.cxf.Messages"}, 
+    {"name":"org.apache.cxf.bus.extension.Messages"}, 
+    {"name":"org.apache.cxf.bus.managers.Messages"}, 
+    {"name":"org.apache.cxf.common.annotation.Messages"}, 
+    {"name":"org.apache.cxf.common.injection.Messages"}, 
+    {"name":"org.apache.cxf.common.jaxb.Messages"}, 
+    {"name":"org.apache.cxf.common.util.Messages"}, 
+    {"name":"org.apache.cxf.endpoint.Messages"}, 
+    {"name":"org.apache.cxf.interceptor.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.impl.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.interceptor.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.provider.Messages"}, 
+    {"name":"org.apache.cxf.jaxrs.utils.Messages"}, 
+    {"name":"org.apache.cxf.resource.Messages"}, 
+    {"name":"org.apache.cxf.service.factory.Messages"}, 
+    {"name":"org.apache.cxf.service.invoker.Messages"}, 
+    {"name":"org.apache.cxf.service.model.Messages"}, 
+    {"name":"org.apache.cxf.staxutils.Messages"}, 
+    {"name":"org.apache.cxf.transport.http.Messages"}, 
+    {"name":"org.apache.cxf.transport.http.netty.server.Messages"}, 
+    {"name":"org.apache.cxf.transport.https.Messages"}, 
+    {"name":"org.apache.cxf.ws.addressing.Messages"}
+  ]
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/client/Client.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/client/Client.java
new file mode 100644
index 0000000..b29f866
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/client/Client.java
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package demo.jaxrs.client;
+
+
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Response;
+
+public final class Client {
+
+    private Client() {
+    }
+
+    public static void main(String[] args) throws Exception {
+        // Sent HTTP GET request to query customer info
+        System.out.println("Sent HTTP GET request to query customer info");
+        javax.ws.rs.client.Client client = ClientBuilder.newClient();
+        
+        String response = client
+            .target("http://localhost:9000/customerservice/customers/123")
+            .request()
+            .get(String.class);
+        System.out.println(response);
+
+        // Sent HTTP GET request to query sub resource product info
+        System.out.println("\n");
+        System.out.println("Sent HTTP GET request to query sub resource product info");
+
+        response = client
+            .target("http://localhost:9000/customerservice/orders/223/products/323")
+            .request()
+            .get(String.class);
+        System.out.println(response);
+
+        // Sent HTTP PUT request to update customer info
+        System.out.println("\n");
+        System.out.println("Sent HTTP PUT request to update customer info");
+        
+        try (Response r = client
+                .target("http://localhost:9000/customerservice/customers")
+                .request()
+                .put(Entity.xml(client.getClass().getResourceAsStream("/update_customer.xml")))) {
+
+            System.out.println("Response status code: " + r.getStatus());
+            System.out.println("Response body: ");
+            System.out.println(r.readEntity(String.class));
+        }
+        
+        // Sent HTTP POST request to add customer
+        System.out.println("\n");
+        System.out.println("Sent HTTP POST request to add customer");
+
+        try (Response r = client
+                .target("http://localhost:9000/customerservice/customers")
+                .request()
+                .post(Entity.xml(client.getClass().getResourceAsStream("/add_customer.xml")))) {
+
+            System.out.println("Response status code: " + r.getStatus());
+            System.out.println("Response body: ");
+            System.out.println(r.readEntity(String.class));
+        }
+
+        System.out.println("\n");
+        System.exit(0);
+    }
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Customer.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Customer.java
new file mode 100644
index 0000000..44025f0
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Customer.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package demo.jaxrs.server;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Customer")
+public class Customer {
+    private long id;
+    private String name;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/CustomerService.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/CustomerService.java
new file mode 100644
index 0000000..24df62b
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/CustomerService.java
@@ -0,0 +1,116 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package demo.jaxrs.server;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+@Path("/customerservice/")
+@Produces("text/xml")
+public class CustomerService {
+    long currentId = 123;
+    Map<Long, Customer> customers = new HashMap<>();
+    Map<Long, Order> orders = new HashMap<>();
+
+    public CustomerService() {
+        init();
+    }
+
+    @GET
+    @Path("/customers/{id}/")
+    public Customer getCustomer(@PathParam("id") String id) {
+        System.out.println("----invoking getCustomer, Customer id is: " + id);
+        long idNumber = Long.parseLong(id);
+        return customers.get(idNumber);
+    }
+
+    @PUT
+    @Path("/customers/")
+    public Response updateCustomer(Customer customer) {
+        System.out.println("----invoking updateCustomer, Customer name is: " + customer.getName());
+        Customer c = customers.get(customer.getId());
+        Response r;
+        if (c != null) {
+            customers.put(customer.getId(), customer);
+            r = Response.ok().build();
+        } else {
+            r = Response.notModified().build();
+        }
+
+        return r;
+    }
+
+    @POST
+    @Path("/customers/")
+    public Response addCustomer(Customer customer) {
+        System.out.println("----invoking addCustomer, Customer name is: " + customer.getName());
+        customer.setId(++currentId);
+
+        customers.put(customer.getId(), customer);
+
+        return Response.ok(customer).build();
+    }
+
+    @DELETE
+    @Path("/customers/{id}/")
+    public Response deleteCustomer(@PathParam("id") String id) {
+        System.out.println("----invoking deleteCustomer, Customer id is: " + id);
+        long idNumber = Long.parseLong(id);
+        Customer c = customers.get(idNumber);
+
+        Response r;
+        if (c != null) {
+            r = Response.ok().build();
+            customers.remove(idNumber);
+        } else {
+            r = Response.notModified().build();
+        }
+
+        return r;
+    }
+
+    @Path("/orders/{orderId}/")
+    public Order getOrder(@PathParam("orderId") String orderId) {
+        System.out.println("----invoking getOrder, Order id is: " + orderId);
+        long idNumber = Long.parseLong(orderId);
+        return orders.get(idNumber);
+    }
+
+    final void init() {
+        Customer c = new Customer();
+        c.setName("John");
+        c.setId(123);
+        customers.put(c.getId(), c);
+
+        Order o = new Order();
+        o.setDescription("order 223");
+        o.setId(223);
+        orders.put(o.getId(), o);
+    }
+
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Order.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Order.java
new file mode 100644
index 0000000..ed88a9a
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Order.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package demo.jaxrs.server;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Order")
+public class Order {
+    private long id;
+    private String description;
+    private Map<Long, Product> products = new HashMap<>();
+
+    public Order() {
+        init();
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String d) {
+        this.description = d;
+    }
+
+    @GET
+    @Path("products/{productId}/")
+    public Product getProduct(@PathParam("productId")int productId) {
+        System.out.println("----invoking getProduct with id: " + productId);
+        return products.get(Long.valueOf(productId));
+    }
+
+    final void init() {
+        Product p = new Product();
+        p.setId(323);
+        p.setDescription("product 323");
+        products.put(p.getId(), p);
+    }
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Product.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Product.java
new file mode 100644
index 0000000..4452ec5
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Product.java
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package demo.jaxrs.server;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "Product")
+public class Product {
+    private long id;
+    private String description;
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String d) {
+        this.description = d;
+    }
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Server.java b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Server.java
new file mode 100644
index 0000000..affb7b0
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/java/demo/jaxrs/server/Server.java
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package demo.jaxrs.server;
+
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+
+public class Server {
+
+    protected Server() throws Exception {
+        JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+        sf.setResourceClasses(CustomerService.class);
+        sf.setResourceProvider(CustomerService.class,
+            new SingletonResourceProvider(new CustomerService()));
+        sf.setAddress("http://localhost:9000/");
+
+        sf.create();
+    }
+
+    public static void main(String[] args) throws Exception {
+        new Server();
+        System.out.println("Server ready...");
+
+        Thread.sleep(5 * 6000 * 1000);
+        System.out.println("Server exiting");
+        System.exit(0);
+    }
+}
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/META-INF/native-image/org.apache.cxf.samples/jax_rs_graalvm_basic/native-image.properties b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/META-INF/native-image/org.apache.cxf.samples/jax_rs_graalvm_basic/native-image.properties
new file mode 100644
index 0000000..b2069af
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/META-INF/native-image/org.apache.cxf.samples/jax_rs_graalvm_basic/native-image.properties
@@ -0,0 +1 @@
+Args = --initialize-at-build-time=org.slf4j.impl.JDK14LoggerAdapter,org.slf4j.impl.StaticLoggerBinder,org.slf4j.LoggerFactory --allow-incomplete-classpath -H:JNIConfigurationResources=${.}/jni-config.json -H:ResourceConfigurationResources=${.}/resource-config.json -H:DynamicProxyConfigurationResources=${.}/proxy-config.json -H:ReflectionConfigurationResources=${.}/reflect-config.json --report-unsupported-elements-at-runtime --enable-url-protocols=http
\ No newline at end of file
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/add_customer.xml b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/add_customer.xml
new file mode 100644
index 0000000..9ef3d4b
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/add_customer.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Customer>
+    <name>Jack</name>
+</Customer>
diff --git a/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/update_customer.xml b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/update_customer.xml
new file mode 100644
index 0000000..228421d
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/graalvm_basic/src/main/resources/update_customer.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Customer>
+    <name>Mary</name>
+    <id>123</id>
+</Customer>
diff --git a/distribution/src/main/release/samples/jaxws_graalvm/README.txt b/distribution/src/main/release/samples/jaxws_graalvm/README.txt
index 4614bd9..d30d4a4 100644
--- a/distribution/src/main/release/samples/jaxws_graalvm/README.txt
+++ b/distribution/src/main/release/samples/jaxws_graalvm/README.txt
@@ -19,29 +19,25 @@ Building and running the demo using Maven
 From the base directory of this sample (i.e., where this README file is
 located), the pom.xml file is used to build and run the demo. 
 
-Using either UNIX or Windows:
+Using either UNIX or Windows, build server:
   
-  mvn clean
-
-Than build server:  
-  
-  mvn package -Pserver  (from one command line window)
+  mvn clean package -Pserver  (from one command line window)
   
 This goal will produce 'target/jaxws-demo-server' executable (platform-dependent) 
 which could be run right away: 
 
-  On Windows: target\jaxws-demo-server.exe
-  On Linux: ./target/jaxws-demo-server
+  On Windows: bin\jaxws-demo-server.exe
+  On Linux: ./bin/jaxws-demo-server
 
 Than build client:
   
-  mvn package -Pclient  (from a second command line window)
+  mvn clean package -Pclient  (from a second command line window)
 
 This goal will produce 'target/jaxws-demo-client' executable (platform-dependent) 
 which could be run right away: 
 
-  On Windows: target\jaxws-demo-client.exe src\main\resources\addNumbers.wsdl
-  On Linux: ./target/jaxws-demo-client src/main/resources/addNumbers.wsdl
+  On Windows: bin\jaxws-demo-client.exe src\main\resources\addNumbers.wsdl
+  On Linux: ./bin/jaxws-demo-client src/main/resources/addNumbers.wsdl
 
 The command should produce the following output (assuming the server is up and running):
 
diff --git a/distribution/src/main/release/samples/jaxws_graalvm/bin/.gitignore b/distribution/src/main/release/samples/jaxws_graalvm/bin/.gitignore
new file mode 100644
index 0000000..86d0cb2
--- /dev/null
+++ b/distribution/src/main/release/samples/jaxws_graalvm/bin/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
diff --git a/distribution/src/main/release/samples/jaxws_graalvm/pom.xml b/distribution/src/main/release/samples/jaxws_graalvm/pom.xml
index d0c4fe7..bc735ad 100644
--- a/distribution/src/main/release/samples/jaxws_graalvm/pom.xml
+++ b/distribution/src/main/release/samples/jaxws_graalvm/pom.xml
@@ -106,6 +106,7 @@
                             <mainClass>demo.jaxws.server.Server</mainClass>
                             <imageName>jaxws-demo-server</imageName>
                             <buildArgs>--no-fallback</buildArgs>
+                            <outputDirectory>${basedir}/bin</outputDirectory>
                         </configuration>
                     </plugin>
                 </plugins>
@@ -159,6 +160,7 @@
                             <mainClass>demo.jaxws.client.Client</mainClass>
                             <imageName>jaxws-demo-client</imageName>
                             <buildArgs>--no-fallback</buildArgs>
+                            <outputDirectory>${basedir}/bin</outputDirectory>
                         </configuration>
                     </plugin>
                 </plugins>
diff --git a/distribution/src/main/release/samples/jaxws_graalvm_dynamic/README.txt b/distribution/src/main/release/samples/jaxws_graalvm_dynamic/README.txt
index 1ec8d31..fc16edf 100644
--- a/distribution/src/main/release/samples/jaxws_graalvm_dynamic/README.txt
+++ b/distribution/src/main/release/samples/jaxws_graalvm_dynamic/README.txt
@@ -38,7 +38,7 @@ Than build the client in capturing mode (please note that the server has to be u
 
 Than build the client:
   
-  mvn -f client -Pclient (from a second command line window)
+  mvn clean package -f client -Pclient (from a second command line window)
 
 This goal will produce 'client/target/jaxws-demo-client' executable (platform-dependent) 
 which could be run right away: 
diff --git a/distribution/src/main/release/samples/pom.xml b/distribution/src/main/release/samples/pom.xml
index a83b143..99e3f8a 100644
--- a/distribution/src/main/release/samples/pom.xml
+++ b/distribution/src/main/release/samples/pom.xml
@@ -148,6 +148,7 @@
         <module>jaxws_graalvm</module>
         <module>jaxws_graalvm_dynamic/client</module>
         <module>jaxws_graalvm_dynamic/server</module>
+        <module>jax_rs/graalvm_basic</module>
     </modules>
     <dependencyManagement>
         <dependencies>