1
Java Packages and Modules
Link
rafabene@gmail.com
@rafabene - bit.ly/java-modules
rafabene@gmail.com
@rafabene
apiVersion: oracle/v1
kind: PrincipalSolutionArchitect
metadata:
name: Rafael Benevides
namespace: Oracle Linux team
annotations:
apache/contributor: Apache DeltaSpike PMC
labels:
developer: Java, NodeJS
hobby: 4x4, drones
spec:
replicas: 1
containers:
image: benevides/rafael:latest
Rafael Benevides
@rafabene - bit.ly/java-modules
@rafabene - bit.ly/java-modules
@rafabene - bit.ly/java-modules
@rafabene - bit.ly/java-modules
Java is moving fast...
Java 14 Released on March 17th 2020
@rafabene - bit.ly/java-modules
Each new release, made Java heavier
API: More features… mores features…
JVM: More features… more features….
Do we need?
@rafabene - bit.ly/java-modules
Project Jigsaw: Java Modules
@rafabene - bit.ly/java-modules
First we need to understand Java packages
We need a way to organize ~4400 Java Classes and Interfaces by grouping them in (224) packages
@rafabene - bit.ly/java-modules
Packages: Folders in a file directory
Declare a class in a package:
package com.rafabene;
Import other packages in a class:
import java.util.*;
import java.util.List;
@rafabene - bit.ly/java-modules
Demo: Java packages
javac App.java -> App.class
Java uses fully-qualified name for a class:
java App
java com.rafabene.App
@rafabene - bit.ly/java-modules
Demo: Classpath
JVM is a "Virtual Machine" with mount-points:
Classpath = Classes root path
java -cp <PATH>
export CLASSPATH=<PATH>
@rafabene - bit.ly/java-modules
JPMS (Java Platform Module System)
@rafabene - bit.ly/java-modules
Problem: Classpath hell
Which Jars are used? Versions?
No difference between public/private classes
@rafabene - bit.ly/java-modules
Can I access class C?
Module M
Package P
Class A, B, C
@rafabene - bit.ly/java-modules
Packages need to be exported
Packages not exported can not be used
@rafabene - bit.ly/java-modules
Java module two-way
@rafabene - bit.ly/java-modules
Java module definition
module-info.java
module first {
requires java.sql;
exports com.rafabene.first;
exports com.rafabene.first.internal to friendmodule;
opens com.rafabene.first.internal;
}
@rafabene - bit.ly/java-modules
@rafabene - bit.ly/java-modules
Demo time
From: java -cp CLASSPATH CLASSNAME
To: java --module-path MODULEPATH -m MODULENAME/CLASSNAME
@rafabene - bit.ly/java-modules
Troubleshooting
java.lang.NoClassDefFoundError
@rafabene - bit.ly/java-modules
jlink
Allows the creation of Runtime Images (Another name for JRE)
@rafabene - bit.ly/java-modules
Creating a custom Runtime image
--strip-java-debug-attributes \
--no-header-files \
--no-man-pages \
--output minimal-jre \
--add-modules second \ (Dependencies will be included)
--launcher second=second/com.rafabene.second.App \
--module-path <MODULE_PATH>
@rafabene - bit.ly/java-modules
Creating Cloud-Native images with jlink and alpine
FROM adoptopenjdk as builder
WORKDIR /app
COPY first.jar .
COPY second.jar .
RUN jlink <with parameters>
FROM alpine:3.7-glibc2.25
WORKDIR /app
COPY --from=builder /app/dist/ ./
ENTRYPOINT ["bin/run"]
openjdk:11 464MB
app:latest 43MB
@rafabene - bit.ly/java-modules
@rafabene - bit.ly/java-modules
The End
(but GraalVM is where you should look next)
@rafabene - bit.ly/java-modules
@rafabene
@RAFABENE
@rafabene - bit.ly/java-modules