Skip to content

Commit 249397b

Browse files
authored
Merge pull request #401 from Josh-Matsuoka/ubi9-jlink
Integrate the JLink workflow and scripts into the Ubi9 container sources
2 parents 4bc78f0 + 9433d1a commit 249397b

File tree

16 files changed

+308
-87
lines changed

16 files changed

+308
-87
lines changed

modules/jdk/11/module.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ envs:
2525
packages:
2626
install:
2727
- java-11-openjdk-devel
28+
- java-11-openjdk-jmods
2829
- tzdata-java
2930

3031
modules:

modules/jdk/17/module.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ envs:
2525
packages:
2626
install:
2727
- java-17-openjdk-devel
28+
- java-17-openjdk-jmods
2829

2930
modules:
3031
install:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
3+
function generatejdkdeps() {
4+
echo "Generating JDK deps"
5+
$JAVA_HOME/bin/java --list-modules > java-modules.txt
6+
< java-modules.txt sed "s/\\@.*//" > modules.txt
7+
grep -Fx -f stripped-deps.txt modules.txt | tr '\n' ',' | tr -d "[:space:]" > module-deps.txt
8+
echo "jdk.zipfs" >> module-deps.txt
9+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
shopt -s globstar
4+
5+
function generate_deps() {
6+
# Create a temporary directory for a module path
7+
# This works around "Module java.xml.bind not found, required by java.ws.rs"
8+
mkdir dependencies
9+
10+
if [[ -v JAVA_LIB_DIR ]]; then
11+
# Serially copy all library JARsinto a flat directory. Serially as we may
12+
# have multiple libs with the same name; in which case, we clobber all but
13+
# one rather than fail the script
14+
find $JAVA_LIB_DIR -type f -name '*.jar' -exec cp -vt dependencies {} \;
15+
16+
echo "Working with: "
17+
echo $JAVA_APP_JAR
18+
echo $JAVA_LIB_DIR
19+
# generate the dependency list
20+
$JAVA_HOME/bin/jdeps --multi-release $JAVA_VERSION -R -s \
21+
--module-path dependencies \
22+
"$JAVA_APP_JAR" \
23+
"$JAVA_LIB_DIR"/**/*.jar \
24+
> deps.txt || {
25+
echo "jdeps failed: return code $?"
26+
exit $?
27+
}
28+
else
29+
$JAVA_HOME/bin/jdeps --multi-release $JAVA_VERSION -R -s \
30+
--module-path dependencies \
31+
"$JAVA_APP_JAR" \
32+
> deps.txt
33+
cat deps.txt
34+
fi
35+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
# TODO: Still Needed?
3+
set -euo pipefail
4+
5+
depsfile="module-deps.txt"
6+
7+
function generate_jre_image() {
8+
test -f $depsfile
9+
modules="$(cat $depsfile)"
10+
11+
$JAVA_HOME/bin/jlink --output "$S2I_JLINK_OUTPUT_PATH" \
12+
--add-modules "$modules" \
13+
--strip-debug --no-header-files --no-man-pages \
14+
--compress=2
15+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
function mkstrippeddeps() {
5+
if [ -f "deps.txt" ]; then
6+
echo "deps exists, filtering"
7+
<deps.txt \
8+
grep 'java\|jdk\.' | # mostly removes target/, but also jdk8internals
9+
sed -E "s/Warning: .*//" | #remove extraneous warnings
10+
sed -E "s/.*-> //" | # remove src of src -> dep
11+
sed -E "s/.*\.jar//" | # remove extraneous dependencies
12+
sed "s#/.*##" | # delete anything after a slash. in practice target/..
13+
sort | uniq |
14+
tee stripped-deps.txt
15+
echo "Stripping dependencies complete"
16+
else
17+
echo "deps does not exist"
18+
fi
19+
}

modules/jlink/configure.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/bin/sh
2+
# Configure module
3+
set -e
4+
5+
SCRIPT_DIR=$(dirname $0)
6+
ARTIFACTS_DIR=${SCRIPT_DIR}/artifacts
7+
8+
chown -R default:root $SCRIPT_DIR
9+
chmod -R ug+rwX $SCRIPT_DIR
10+
chmod ug+x ${ARTIFACTS_DIR}/opt/jboss/container/java/jlink/*
11+
12+
pushd ${ARTIFACTS_DIR}
13+
cp -pr * /
14+
popd

modules/jlink/module.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
schema_version: 1
2+
3+
name: "jboss.container.java.jlink"
4+
version: "2.0"
5+
description: ^
6+
"Provides support for building custom JREs with a slimmed
7+
down set of modules by making use of Jdeps and Jlink"
8+
9+
execute:
10+
- script: configure.sh
11+
12+
envs:
13+
- name: JBOSS_CONTAINER_JAVA_JLINK_MODULE
14+
value: /opt/jboss/container/java/jlink
15+
- name: S2I_JLINK_OUTPUT_PATH
16+
value: /tmp/jre
17+
18+
modules:
19+
install:
20+
- name: jboss.container.java.run
21+
- name: jboss.container.util.pathfinder
22+
23+
packages:
24+
install:
25+
- binutils # for objcopy

modules/run/artifacts/opt/jboss/container/java/run/run-java.sh

Lines changed: 5 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -22,101 +22,19 @@ check_error() {
2222
fi
2323
}
2424

25-
# detect Quarkus fast-jar package type (OPENJDK-631)
26-
is_quarkus_fast_jar() {
27-
if test -f quarkus-app/quarkus-run.jar; then
28-
log_info "quarkus fast-jar package type detected"
29-
echo quarkus-app/quarkus-run.jar
30-
return 0
31-
else
32-
return 1
33-
fi
34-
}
35-
36-
# Try hard to find a sane default jar-file
37-
auto_detect_jar_file() {
38-
local dir=$1
39-
40-
# Filter out temporary jars from the shade plugin which start with 'original-'
41-
local old_dir=$(pwd)
42-
cd ${dir}
43-
if [ $? = 0 ]; then
44-
45-
if quarkus="$(is_quarkus_fast_jar)"; then
46-
echo "$quarkus"
47-
return
48-
fi
49-
50-
local nr_jars=`ls *.jar 2>/dev/null | grep -v '^original-' | wc -l | tr -d '[[:space:]]'`
51-
if [ ${nr_jars} = 1 ]; then
52-
ls *.jar | grep -v '^original-'
53-
exit 0
54-
fi
55-
56-
log_error "Neither \$JAVA_MAIN_CLASS nor \$JAVA_APP_JAR is set and ${nr_jars} JARs found in ${dir} (1 expected)"
57-
cd ${old_dir}
58-
else
59-
log_error "No directory ${dir} found for auto detection"
60-
fi
61-
}
62-
63-
# Check directories (arg 2...n) for a jar file (arg 1)
64-
get_jar_file() {
65-
local jar=$1
66-
shift;
67-
68-
if [ "${jar:0:1}" = "/" ]; then
69-
if [ -f "${jar}" ]; then
70-
echo "${jar}"
71-
else
72-
log_error "No such file ${jar}"
73-
fi
74-
else
75-
for dir in $*; do
76-
if [ -f "${dir}/$jar" ]; then
77-
echo "${dir}/$jar"
78-
return
79-
fi
80-
done
81-
log_error "No ${jar} found in $*"
82-
fi
83-
}
84-
8525
load_env() {
8626
# Configuration stuff is read from this file
8727
local run_env_sh="run-env.sh"
88-
28+
8929
# Load default default config
9030
if [ -f "${JBOSS_CONTAINER_JAVA_RUN_MODULE}/${run_env_sh}" ]; then
9131
source "${JBOSS_CONTAINER_JAVA_RUN_MODULE}/${run_env_sh}"
9232
fi
9333

94-
# Check also $JAVA_APP_DIR. Overrides other defaults
95-
# It's valid to set the app dir in the default script
96-
if [ -z "${JAVA_APP_DIR}" ]; then
97-
# XXX: is this correct? This is defaulted above to /deployments. Should we
98-
# define a default to the old /opt/java-run?
99-
JAVA_APP_DIR="${JBOSS_CONTAINER_JAVA_RUN_MODULE}"
100-
else
101-
if [ -f "${JAVA_APP_DIR}/${run_env_sh}" ]; then
102-
source "${JAVA_APP_DIR}/${run_env_sh}"
103-
fi
104-
fi
105-
export JAVA_APP_DIR
106-
107-
# JAVA_LIB_DIR defaults to JAVA_APP_DIR
108-
export JAVA_LIB_DIR="${JAVA_LIB_DIR:-${JAVA_APP_DIR}}"
109-
if [ -z "${JAVA_MAIN_CLASS}" ] && [ -z "${JAVA_APP_JAR}" ]; then
110-
JAVA_APP_JAR="$(auto_detect_jar_file ${JAVA_APP_DIR})"
111-
check_error "${JAVA_APP_JAR}"
112-
fi
113-
114-
if [ "x${JAVA_APP_JAR}" != x ]; then
115-
local jar="$(get_jar_file ${JAVA_APP_JAR} ${JAVA_APP_DIR} ${JAVA_LIB_DIR})"
116-
check_error "${jar}"
117-
export JAVA_APP_JAR=${jar}
118-
else
119-
export JAVA_MAIN_CLASS
34+
# Load JAVA_APP_JAR and JAVA_LIB_DIR
35+
if [ -f "${JBOSS_CONTAINER_UTIL_PATHFINDER_MODULE}/pathfinder.sh" ]; then
36+
source "$JBOSS_CONTAINER_UTIL_PATHFINDER_MODULE/pathfinder.sh"
37+
setup_java_app_and_lib
12038
fi
12139
}
12240

modules/s2i/bash/artifacts/usr/local/s2i/assemble

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,24 @@ source "${JBOSS_CONTAINER_JAVA_S2I_MODULE}/maven-s2i-overrides"
1414
# invoke the build
1515
maven_s2i_build
1616

17+
# run the pathfinder scripts to define JAVA_APP_JAR and JAVA_LIB_DIR
18+
source "${JBOSS_CONTAINER_UTIL_PATHFINDER_MODULE}/pathfinder.sh"
19+
echo "Setting up java app and lib variables"
20+
setup_java_app_and_lib
21+
22+
# include our jlink scripts
23+
source "${JBOSS_CONTAINER_JAVA_JLINK_MODULE}/mkdeps.sh"
24+
echo "Invoking mkdeps"
25+
generate_deps
26+
27+
source "${JBOSS_CONTAINER_JAVA_JLINK_MODULE}/mkstrippeddeps.sh"
28+
echo "Stripping dependencies"
29+
mkstrippeddeps
30+
31+
source "${JBOSS_CONTAINER_JAVA_JLINK_MODULE}/generatejdkdeps.sh"
32+
echo "Generating JDK dependencies"
33+
generatejdkdeps
34+
35+
source "${JBOSS_CONTAINER_JAVA_JLINK_MODULE}/mkjreimage.sh"
36+
echo "Linking jre"
37+
generate_jre_image

0 commit comments

Comments
 (0)