blob: a6d561dda84989d6d1b58ad4ebbc2b9e108b9e1d [file] [log] [blame]
Marc Kupietzfbfcd042025-11-16 13:33:32 +01001#!/usr/bin/env bash
Marc Kupietz02cd8bf2025-11-16 14:21:25 +01002# Shebang header for korapxmltool: auto-enables native access (Java 25+) and chooses a default -Xmx.
Marc Kupietzfbfcd042025-11-16 13:33:32 +01003# Usage:
4# cat korapxmltool.shebang app/build/libs/korapxmltool.jar > korapxmltool
5# chmod +x korapxmltool
6# (Run `zip -A korapxmltool` if your unzip/java complains about prepended bytes.)
Marc Kupietz02cd8bf2025-11-16 14:21:25 +01007#
8# Override memory:
Marc Kupietz570d0e02025-11-17 10:42:41 +01009# export KORAPXMLTOOL_XMX=20g # sets -Xmx20g
10# export KORAPXMLTOOL_XMX=8192m # sets -Xmx8192m
Marc Kupietz02cd8bf2025-11-16 14:21:25 +010011# export KORAPXMLTOOL_JAVA_OPTS="... -Xmx4g" # full custom opts
12# Otherwise we pick ~75% of detected memory (cgroup aware), clamped to [1024m, 65536m].
Marc Kupietzfbfcd042025-11-16 13:33:32 +010013
14set -euo pipefail
15
Marc Kupietz02cd8bf2025-11-16 14:21:25 +010016has_xmx=false
17for v in "${JDK_JAVA_OPTIONS:-}" "${JAVA_TOOL_OPTIONS:-}" "${KORAPXMLTOOL_JAVA_OPTS:-}"; do
18 [[ $v == *"-Xmx"* ]] && has_xmx=true && break
19done
20for arg in "$@"; do
21 [[ $arg == -Xmx* ]] && has_xmx=true && break
22done
23
24detect_mem_limit_mb() {
25 local cgroup_limit
26 if [[ -f /sys/fs/cgroup/memory.max ]]; then
27 cgroup_limit=$(< /sys/fs/cgroup/memory.max)
28 [[ $cgroup_limit == "max" ]] && cgroup_limit=""
29 elif [[ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ]]; then
30 cgroup_limit=$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)
31 fi
32
33 local limit_mb=""
34 if [[ -n ${cgroup_limit:-} && $cgroup_limit =~ ^[0-9]+$ && $cgroup_limit -lt 9223372036854771712 ]]; then
35 limit_mb=$(( cgroup_limit / 1024 / 1024 ))
36 fi
37
38 local memtotal_kb
39 memtotal_kb=$(awk '/MemTotal/ { print $2; exit }' /proc/meminfo 2>/dev/null || echo "")
40 local total_mb=""
41 if [[ $memtotal_kb =~ ^[0-9]+$ ]]; then
42 total_mb=$(( memtotal_kb / 1024 ))
43 fi
44
45 if [[ -n $limit_mb && -n $total_mb ]]; then
46 (( limit_mb < total_mb )) && echo "$limit_mb" || echo "$total_mb"
47 else
48 echo "${limit_mb:-${total_mb:-4096}}"
49 fi
50}
51
Marc Kupietzfbfcd042025-11-16 13:33:32 +010052EXTRA_OPTS=()
53if [[ "${JDK_JAVA_OPTIONS:-}" != *"--enable-native-access="* ]]; then
54 EXTRA_OPTS+=(--enable-native-access=ALL-UNNAMED)
55fi
56
Marc Kupietz02cd8bf2025-11-16 14:21:25 +010057if ! $has_xmx; then
Marc Kupietz570d0e02025-11-17 10:42:41 +010058 if [[ -n ${KORAPXMLTOOL_XMX:-} ]]; then
59 # Handle KORAPXMLTOOL_XMX with units (g/G for GB, m/M for MB, or just number for MB)
60 if [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[gG]$ ]]; then
61 # Convert GB to MB
62 xmx_gb=${KORAPXMLTOOL_XMX%[gG]}
63 xmx_mb=$((xmx_gb * 1024))
64 elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[mM]$ ]]; then
65 # Extract MB value
66 xmx_mb=${KORAPXMLTOOL_XMX%[mM]}
67 elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+$ ]]; then
68 # Treat plain number as MB for backward compatibility
69 xmx_mb=${KORAPXMLTOOL_XMX}
70 else
71 echo "Warning: Invalid KORAPXMLTOOL_XMX format '${KORAPXMLTOOL_XMX}'. Use formats like '20g', '8192m', or '8192'." >&2
72 xmx_mb=""
73 fi
74 fi
75
76 # If no valid XMX was provided or parsing failed, use auto-detection
77 if [[ -z ${xmx_mb:-} ]]; then
Marc Kupietz02cd8bf2025-11-16 14:21:25 +010078 mem_mb=$(detect_mem_limit_mb)
79 xmx_mb=$(( mem_mb * 75 / 100 ))
80 (( xmx_mb < 1024 )) && xmx_mb=1024
81 (( xmx_mb > 65536 )) && xmx_mb=65536
82 fi
83 EXTRA_OPTS+=("-Xmx${xmx_mb}m")
84fi
85
86exec java "${EXTRA_OPTS[@]}" ${KORAPXMLTOOL_JAVA_OPTS:-} -jar "$0" "$@"