├── Dockerfile.scratch ├── HelloWorld.java ├── Dockerfile ├── Dockerfile.scratch2 ├── README.md ├── HelloWorldServer.java └── Dockerfile.full /Dockerfile.scratch: -------------------------------------------------------------------------------- 1 | FROM scratch 2 | ADD helloworld / 3 | CMD ["/helloworld"] -------------------------------------------------------------------------------- /HelloWorld.java: -------------------------------------------------------------------------------- 1 | 2 | public class HelloWorld { 3 | public static void main(String[] args) { 4 | System.out.println("Hello World"); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM oraclelinux:7-slim 2 | 3 | ENV GRAALVM_PKG=graalvm-ce-1.0.0-rc1-linux-amd64.tar.gz \ 4 | JAVA_HOME=/usr/graalvm-1.0.0-rc1/jdk \ 5 | PATH=/usr/graalvm-1.0.0-rc1/bin:$PATH 6 | 7 | ADD $GRAALVM_PKG /usr/ 8 | 9 | RUN yum -y install gcc; \ 10 | yum -y install zlib-devel; \ 11 | alternatives --install /usr/bin/java java $JAVA_HOME/bin/java 20000 && \ 12 | alternatives --install /usr/bin/javac javac $JAVA_HOME/bin/javac 20000 && \ 13 | alternatives --install /usr/bin/jar jar $JAVA_HOME/bin/jar 20000 -------------------------------------------------------------------------------- /Dockerfile.scratch2: -------------------------------------------------------------------------------- 1 | FROM oraclelinux:7-slim AS BASE 2 | 3 | FROM scratch 4 | 5 | COPY --from=BASE /lib64/libc.so.6 /lib64/libc.so.6 6 | COPY --from=BASE /lib64/libdl.so.2 /lib64/libdl.so.2 7 | COPY --from=BASE /lib64/libpthread.so.0 /lib64/libpthread.so.0 8 | COPY --from=BASE /lib64/libz.so.1 /lib64/libz.so.1 9 | COPY --from=BASE /lib64/librt.so.1 /lib64/librt.so.1 10 | COPY --from=BASE /lib64/libcrypt.so.1 /lib64/libcrypt.so.1 11 | COPY --from=BASE /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 12 | COPY --from=BASE /lib64/libfreebl3.so /lib64/libfreebl3.so 13 | 14 | ADD helloworld / 15 | 16 | CMD ["/helloworld"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blog-native-java-graalvm 2 | 3 | ### Setup 4 | 5 | ```bash 6 | wget https://github.com/oracle/graal/releases/download/vm-1.0.0-rc1/graalvm-ce-1.0.0-rc1-linux-amd64.tar.gz 7 | docker build . -t graalvm 8 | ``` 9 | 10 | ### Hello World 11 | ```bash 12 | docker run --rm -tiv `pwd`:/work -w /work 13 | bash-4.2# javac HelloWorld.java 14 | bash-4.2# native-image HelloWorld 15 | bash-4.2# ./helloworld 16 | ``` 17 | 18 | ### Hello World Server 19 | ```bash 20 | docker run --rm -tiv `pwd`:/work -w /work 21 | bash-4.2# javac HelloWorldServer.java 22 | bash-4.2# native-image HelloWorldServer 23 | bash-4.2# ./helloworldserver 24 | ``` 25 | 26 | ### Containerize 27 | ```bash 28 | docker build -f=Dockerfile.full . -t hello-graalvm 29 | ``` -------------------------------------------------------------------------------- /HelloWorldServer.java: -------------------------------------------------------------------------------- 1 | import java.io.IOException; 2 | import java.io.OutputStream; 3 | import java.net.InetSocketAddress; 4 | 5 | import com.sun.net.httpserver.HttpExchange; 6 | import com.sun.net.httpserver.HttpHandler; 7 | import com.sun.net.httpserver.HttpServer; 8 | 9 | public class HelloWorldServer { 10 | 11 | public static void main(String[] args) throws Exception { 12 | HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); 13 | server.createContext("/", new MyHandler()); 14 | server.setExecutor(null); 15 | server.start(); 16 | } 17 | 18 | static class MyHandler implements HttpHandler { 19 | @Override 20 | public void handle(HttpExchange t) throws IOException { 21 | String response = "Hello World"; 22 | t.sendResponseHeaders(200, response.length()); 23 | OutputStream os = t.getResponseBody(); 24 | os.write(response.getBytes()); 25 | os.close(); 26 | } 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /Dockerfile.full: -------------------------------------------------------------------------------- 1 | FROM oraclelinux:7-slim AS BASE 2 | 3 | ENV GRAALVM_PKG=graalvm-ce-1.0.0-rc1-linux-amd64.tar.gz \ 4 | JAVA_HOME=/usr/graalvm-1.0.0-rc1/jdk \ 5 | PATH=/usr/graalvm-1.0.0-rc1/bin:$PATH 6 | 7 | ADD $GRAALVM_PKG /usr/ 8 | 9 | RUN yum -y install gcc; \ 10 | yum -y install zlib-devel; \ 11 | alternatives --install /usr/bin/java java $JAVA_HOME/bin/java 20000 && \ 12 | alternatives --install /usr/bin/javac javac $JAVA_HOME/bin/javac 20000 && \ 13 | alternatives --install /usr/bin/jar jar $JAVA_HOME/bin/jar 20000 14 | 15 | # building 16 | COPY *.java /target/ 17 | WORKDIR /target 18 | RUN javac *.java 19 | RUN native-image HelloWorldServer 20 | RUN native-image HelloWorld 21 | 22 | # packing minimal container 23 | FROM scratch 24 | 25 | COPY --from=BASE /lib64/libc.so.6 /lib64/libc.so.6 26 | COPY --from=BASE /lib64/libdl.so.2 /lib64/libdl.so.2 27 | COPY --from=BASE /lib64/libpthread.so.0 /lib64/libpthread.so.0 28 | COPY --from=BASE /lib64/libz.so.1 /lib64/libz.so.1 29 | COPY --from=BASE /lib64/librt.so.1 /lib64/librt.so.1 30 | COPY --from=BASE /lib64/libcrypt.so.1 /lib64/libcrypt.so.1 31 | COPY --from=BASE /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 32 | COPY --from=BASE /lib64/libfreebl3.so /lib64/libfreebl3.so 33 | 34 | COPY --from=BASE /target/helloworld / 35 | COPY --from=BASE /target/helloworldserver / 36 | 37 | CMD ["/helloworld"] --------------------------------------------------------------------------------