- Install script improved to run with /bin/sh

- Dockerfile changed to use install.sh script (Works on x64 and aarch64
architecture)
- Dockerfile_x64 with old build script for tests
- Script warp4j improved to support to run on aarch64 architecture

Cleaning up repository
Updating compatibility in README.md
This commit is contained in:
David 2022-08-12 18:40:09 +02:00 committed by david
parent aeffdc3eb5
commit b6b0f56980
10 changed files with 388 additions and 260 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
fatjar/ fatjar/
warped/ warped/
TODO.md TODO.md
/.project
/.settings/

22
CHANGELOG.md Normal file
View File

@ -0,0 +1,22 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.0.0] - 2024-05-20
### Added
- Install script improved to run with /bin/sh
- Dockerfile changed to use install.sh script (Works on x64 and aarch64 architecture)
- Dockerfile_x64 with old build script for tests
- Script warp4j improved to support to run on aarch64 architecture
## [origin warp4j] - 2019-02-28
- See origin repository: https://github.com/guziks/warp4j
[unreleased]: https://github.com/kirbylink/warp4j/compare/master...HEAD
[1.0.0]: https://github.com/kirbylink/warp4j/compare/stable...master
[origin warp4j]: https://github.com/guziks/warp4j

View File

@ -5,15 +5,5 @@ RUN apt-get update && apt-get install -y \
unzip \ unzip \
zip \ zip \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL -o /tmp/warp-packer \ RUN curl -s https://github.com/kirbylink/warp4j/raw/branch/master/install.sh | /bin/sh -s
https://github.com/dgiagio/warp/releases/download/v0.3.0/linux-x64.warp-packer \
&& install -D \
--mode=755 \
--owner=root \
--group=root \
/tmp/warp-packer \
/usr/local/bin \
&& rm /tmp/warp-packer
WORKDIR /workdir
COPY warp4j /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/warp4j" ] ENTRYPOINT [ "/usr/local/bin/warp4j" ]

View File

@ -1,12 +1,13 @@
FROM debian:stable-slim FROM debian:stable-slim
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
binutils \
curl \ curl \
file \ file \
unzip \ unzip \
zip \ zip \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL -o /tmp/warp-packer \ RUN curl -fsSL -o /tmp/warp-packer \
https://github.com/dgiagio/warp/releases/download/v0.3.0/linux-x64.warp-packer \ https://github.com/kirbylink/warp/releases/download/1.0.0/linux-x64.warp-packer \
&& install -D \ && install -D \
--mode=755 \ --mode=755 \
--owner=root \ --owner=root \
@ -14,14 +15,6 @@ RUN curl -fsSL -o /tmp/warp-packer \
/tmp/warp-packer \ /tmp/warp-packer \
/usr/local/bin \ /usr/local/bin \
&& rm /tmp/warp-packer && rm /tmp/warp-packer
RUN curl -fsSL -o /tmp/warp4j \
https://raw.githubusercontent.com/guziks/warp4j/stable/warp4j \
&& install -D \
--mode=755 \
--owner=root \
--group=root \
/tmp/warp4j \
/usr/local/bin \
&& rm /tmp/warp4j
WORKDIR /workdir WORKDIR /workdir
COPY warp4j /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/warp4j" ] ENTRYPOINT [ "/usr/local/bin/warp4j" ]

View File

@ -2,13 +2,20 @@
Here are several more ways to install `warp4j`. Here are several more ways to install `warp4j`.
## Install script
Run the [install.sh](./install.sh) script from source or use the following command:
```sh
curl -s https://github.com/kirbylink/warp4j/raw/branch/master/install.sh | /bin/sh -s
```
## Manual ## Manual
First install [warp-packer](https://github.com/dgiagio/warp/releases) and ensure other common tools available: `awk`, `curl`, `file`, `grep`, `sed`, `sort`, `tar`, `unzip`, optional: `zip`. Then install `warp4j` like this: First install [warp-packer](https://github.com/kirbylink/warp/releases) and ensure other common tools available: `awk`, `curl`, `file`, `grep`, `sed`, `sort`, `tar`, `unzip`, optional: `zip`. Then install `warp4j` like this:
``` ```
$ LOCATION=/usr/local/bin \ $ LOCATION=/usr/local/bin \
LINK=https://raw.githubusercontent.com/guziks/warp4j/stable/warp4j \ LINK=https://github.com/kirbylink/warp4j/raw/branch/master/warp4j \
TEMP_LOCATION=/tmp/warp4j \ TEMP_LOCATION=/tmp/warp4j \
bash -c 'curl -fsSL -o $TEMP_LOCATION $LINK && \ bash -c 'curl -fsSL -o $TEMP_LOCATION $LINK && \
sudo install -D \ sudo install -D \
@ -22,14 +29,4 @@ Previous command can be also used to upgrade to the latest version.
## Docker ## Docker
See docker hub [page](https://hub.docker.com/r/guziks/warp4j). See [Dockerfile](./Dockerfile)
## Moor
Instead of direct `docker run` command you can make a launcher with [moor](https://github.com/guziks/moor):
```
$ moor guziks/warp4j:stable warp4j
```
Then use as an ordinary command.

View File

@ -6,7 +6,7 @@ Turn JAR (java archive) into self-contained executable in a single command.
- downloads java runtimes automatically - downloads java runtimes automatically
- makes runtimes optimized for your application - makes runtimes optimized for your application
- creates self-contained binaries for Linux, macOS and Windows using [warp-packer](https://github.com/dgiagio/warp) - creates self-contained binaries for Linux, macOS and Windows using [warp-packer](https://github.com/kirbylink/warp)
- works on Linux, macOS and Windows (with Windows Subsystem for Linux) - works on Linux, macOS and Windows (with Windows Subsystem for Linux)
- supports cross "compilation" - supports cross "compilation"
- does not require neither JDK nor JRE installed - does not require neither JDK nor JRE installed
@ -20,7 +20,7 @@ Just put both `warp4j` and `warp-packer` somewhere in your PATH and run `warp4j
Curl one-liner installs latest versions of both `warp4j` and `warp-packer`: Curl one-liner installs latest versions of both `warp4j` and `warp-packer`:
``` ```
$ bash -c "$(curl -fsSL https://raw.githubusercontent.com/guziks/warp4j/stable/install)" bash -c "$(curl -fsSL https://github.com/kirbylink/warp4j/raw/branch/master/install.sh)"
``` ```
This script will show missing dependencies (if there are any), they must be installed with your package manager. This script will show missing dependencies (if there are any), they must be installed with your package manager.
@ -56,6 +56,7 @@ See help:
``` ```
$ wapr4j --help $ wapr4j --help
Usage: warp4j [options] <app.jar> Usage: warp4j [options] <app.jar>
Turn JAR (java archive) into self-contained executable Turn JAR (java archive) into self-contained executable
@ -63,12 +64,23 @@ Turn JAR (java archive) into self-contained executable
Options: Options:
-j, --java-version <version> -j, --java-version <version>
override JDK/JRE version override JDK/JRE version
examples: "11", "11.0", "11.0.2", "11.0.2+9" examples: "17", "17.0", "17.0.2", "17.0.2+9"
(default: 11) (default: 17)
-cp, --class-path <classpath>
adds additional classpaths to the jdeps call
--auto-class-path extract and get class-path values from jar file
ignored when -cp, --class-path is set
--spring-boot extract and get class-path values from
Spring-Boot application jar file
ignored when -cp, --class-path is set
-o, --output <directory> -o, --output <directory>
override output directory; override output directory;
this is relative to current PWD this is relative to current PWD
(default: ./warped) (default: ./warped)
-p, --prefix <prefix>
if set, warp-packer will use the prefix
as target folder in which the
application should be extracted
--list show available java releases; --list show available java releases;
takes into consideration other options: takes into consideration other options:
"--java-version", "--no-optimize", "--jvm-impl"; "--java-version", "--no-optimize", "--jvm-impl";
@ -81,28 +93,27 @@ Options:
--pull check if more recent JDK/JRE distro is available; --pull check if more recent JDK/JRE distro is available;
by default latest cached version that matches by default latest cached version that matches
"--java-version" is used "--java-version" is used
to get the classpath for jdeps call
--linux create binary for Linux --linux create binary for Linux
--macos create binary for macOS --macos create binary for macOS
--windows create binary for Windows --windows create binary for Windows
if no targets are specified then binaries for if no targets are specified then binaries for
all targets are created all targets are created
--jvm-impl jvm implementation: hotspot or openj9
(default: hotspot)
--jvm-options <options> --jvm-options <options>
passed to java like this: passed to java like this:
"java <options> -jar <jar file>"; "java <options> -jar <jar file>";
use quotes when passing multiple options use quotes when passing multiple options
example: '-Xms512m -Xmx1024m' example: '-Xms512m -Xmx1024m'
-s, --silent using javaw instead of java for windows
-h, --help show this message -h, --help show this message
``` ```
## Compatibility ## Compatibility
Tested on the following operating systems: Tested on the following operating systems:
- Ubuntu 18.04 - Debian 12.5
- macOS Mojave
- Windows Subsystem for Linux with Ubuntu 14.04
## Cache Location ## Cache Location

View File

@ -1,18 +0,0 @@
# Warp4j
Turn JAR (java archive) into self-contained executable in a single command.
See project [page](https://github.com/guziks/warp4j) for more information.
## Usage
```
$ docker run --rm -it \
-e "WARP4J_CACHE=/cache" \
--volume <cache on host>:/cache \
--volume <jars on host>:/workdir \
--user $(id -u):$(id -g) \
guziks/warp4j:stable <app.jar>
```
Change according to your requirements, but volume with working directory is mandatory.

114
install
View File

@ -1,114 +0,0 @@
#!/usr/bin/env bash
# install location
LOCATION=/usr/local/bin
# exit top level program from subshell
trap "exit 1" TERM
export TOP_PID=$$
function fail() {
kill -s TERM $TOP_PID
}
# platform IDs
LIN=linux
MAC=macos
WIN=windows
# returns this platform ID
function get_this_platform() {
local this_platform="$(uname -s)"
case $this_platform in
Linux*) echo $LIN ;;
Darwin*) echo $MAC ;;
*)
echo "Error: Unsupported platform $this_platform" >&2
fail
;;
esac
}
# actually sets this platform
THIS_PLATFORM=$(get_this_platform)
# fetches latest release download link for the platform
function get_latest_warp_link() {
local this_platform=$1
local info
info=$(curl -fsSL https://api.github.com/repos/dgiagio/warp/releases)
if [[ $? != 0 ]]; then
echo "Error: Failed to get information about releases" >&2
fail
fi
echo "$info" \
| grep "browser_download_url" \
| grep "$this_platform-x64.warp-packer" \
| head -n 1 \
| awk '{print $2}' \
| sed -e 's/"//g'
}
# downloads and installs single binary
function install() {
local name=$1
local link=$2
local temp_location="/tmp/$name"
echo "Downloading $name..."
curl -fsSL -o "$temp_location" "$link"
if [[ $? != 0 ]]; then
echo "Error: Failed to download $name" >&2
fail
fi
echo "Creating $LOCATION/$name..."
sudo install -D \
--mode=755 \
--owner=root \
--group=root \
"$temp_location" "$LOCATION"
if [[ $? != 0 ]]; then
echo "Error: Failed to install $name" >&2
fail
fi
}
# returns missing dependencies
function get_missing_deps() {
local deps=(
"awk" \
"curl" \
"file" \
"grep" \
"sed" \
"sort" \
"tar" \
"unzip" \
"zip" \
)
for d in ${deps[@]}; do
if ! command -v $d &> /dev/null ; then
echo -n "$d "
fi
done
}
WARP4J_LINK="https://raw.githubusercontent.com/guziks/warp4j/stable/warp4j"
echo "Getting information about warp-packer releases..."
WARP_LINK=$(get_latest_warp_link $THIS_PLATFORM)
MISSING_DEPS=$(get_missing_deps)
install "warp-packer" "$WARP_LINK" && \
install "warp4j" "$WARP4J_LINK"
if [[ -z $MISSING_DEPS ]]; then
echo "Successfully installed"
else
echo "Main tools successfully installed"
echo "Please install following with your package manager:"
for d in ${MISSING_DEPS[@]}; do
echo -n "$d "
done
echo
exit 1
fi

148
install.sh Executable file
View File

@ -0,0 +1,148 @@
#!/usr/bin/env bash
# install location
LOCATION=/usr/local/bin
# exit top level program from subshell
trap "exit 1" TERM
export TOP_PID=$$
fail() {
kill -s TERM $TOP_PID
}
# platform IDs
LIN=linux
MAC=macos
WIN=windows
# Urls
LIN_X64_URL=https://github.com/kirbylink/warp/releases/download/1.0.0/linux-x64.warp-packer
LIN_AARCH64_URL=https://github.com/kirbylink/warp/releases/download/1.0.0/linux-aarch64.warp-packer
MAC_URL=https://github.com/kirbylink/warp/releases/download/1.0.0/macos-x64.warp-packer
# platform architecture
X64=x64
AARCH64=aarch64
# returns this platform ID
get_this_platform() {
local this_platform="$(uname -s)"
case $this_platform in
Linux*) echo $LIN ;;
Darwin*) echo $MAC ;;
*)
echo "Error: Unsupported platform $this_platform" >&2
fail
;;
esac
}
# returns this platform architecture
get_this_architecture() {
local this_machine="$(uname -m)"
case $this_machine in
x86_64) echo $X64 ;;
aarch64) echo $AARCH64 ;;
*)
echo "Error: Unsupported machine $this_machine" >&2
fail
;;
esac
}
# actually sets this platform
THIS_PLATFORM=$(get_this_platform)
# actually sets this architecture
THIS_ARCHITECTURE=$(get_this_architecture)
# fetches latest release download link for the platform
get_warp_link() {
local this_platform=$1
local this_architecture=$2
if [ "$this_platform" = "$LIN" ]; then
echo "$LIN_URL"
if [ "$this_architecture" = "$X64" ]; then
echo "$LIN_X64_URL"
else
echo "$LIN_AARCH64_URL"
fi
else
echo "$MAC_URL"
fi
}
# downloads and installs single binary
install() {
local name=$1
local link=$2
local temp_location="/tmp/$name"
echo "Downloading $name..."
curl -fsSL -o $temp_location $link
if [ $? != 0 ]; then
echo "Error: Failed to download $name" >&2
fail
fi
echo "Creating $LOCATION/$name..."
su -c "install -D \
--mode=755 \
--owner=root \
--group=root \
'$temp_location' '$LOCATION'"
if [ $? != 0 ]; then
echo "Error: Failed to install $name" >&2
fail
fi
rm $temp_location
}
# returns missing dependencies
get_missing_deps() {
if ! command -v awk > /dev/null 2<&1; then
echo -n "awk "
fi
if ! command -v curl > /dev/null 2<&1; then
echo -n "curl "
fi
if ! command -v file > /dev/null 2<&1; then
echo -n "file "
fi
if ! command -v grep > /dev/null 2<&1; then
echo -n "grep "
fi
if ! command -v sed > /dev/null 2<&1; then
echo -n "sed "
fi
if ! command -v sort > /dev/null 2<&1; then
echo -n "sort "
fi
if ! command -v tar > /dev/null 2<&1; then
echo -n "tar "
fi
if ! command -v unzip > /dev/null 2<&1; then
echo -n "unzip "
fi
if ! command -v zip > /dev/null 2<&1; then
echo -n "zip"
fi
}
WARP4J_LINK="https://github.com/kirbylink/warp4j/raw/branch/master/warp4j"
echo "Getting information about warp-packer releases..."
WARP_LINK=$(get_warp_link $THIS_PLATFORM $THIS_ARCHITECTURE)
MISSING_DEPS=$(get_missing_deps)
install "warp-packer" "$WARP_LINK" && \
install "warp4j" "$WARP4J_LINK"
if [ -z "$MISSING_DEPS" ]; then
echo "Successfully installed"
else
echo "Main tools successfully installed"
echo "Please install following with your package manager:"
echo $MISSING_DEPS
exit 1
fi

267
warp4j
View File

@ -9,12 +9,23 @@ function print_help {
echo 'Options:' echo 'Options:'
echo ' -j, --java-version <version>' echo ' -j, --java-version <version>'
echo ' override JDK/JRE version' echo ' override JDK/JRE version'
echo ' examples: "11", "11.0", "11.0.2", "11.0.2+9"' echo ' examples: "17", "17.0", "17.0.2", "17.0.2+9"'
echo ' (default: 11)' echo ' (default: 17)'
echo ' -cp, --class-path <classpath>'
echo ' adds additional classpaths to the jdeps call'
echo ' --auto-class-path extract and get class-path values from jar file'
echo ' ignored when -cp, --class-path is set'
echo ' --spring-boot extract and get class-path values from'
echo ' Spring-Boot application jar file'
echo ' ignored when -cp, --class-path is set'
echo ' -o, --output <directory>' echo ' -o, --output <directory>'
echo ' override output directory;' echo ' override output directory;'
echo ' this is relative to current PWD' echo ' this is relative to current PWD'
echo ' (default: ./warped)' echo ' (default: ./warped)'
echo ' -p, --prefix <prefix>'
echo ' if set, warp-packer will use the prefix'
echo ' as target folder in which the '
echo ' application should be extracted'
echo ' --list show available java releases;' echo ' --list show available java releases;'
echo ' takes into consideration other options:' echo ' takes into consideration other options:'
echo ' "--java-version", "--no-optimize", "--jvm-impl";' echo ' "--java-version", "--no-optimize", "--jvm-impl";'
@ -27,18 +38,18 @@ function print_help {
echo ' --pull check if more recent JDK/JRE distro is available;' echo ' --pull check if more recent JDK/JRE distro is available;'
echo ' by default latest cached version that matches' echo ' by default latest cached version that matches'
echo ' "--java-version" is used' echo ' "--java-version" is used'
echo ' to get the classpath for jdeps call'
echo ' --linux create binary for Linux' echo ' --linux create binary for Linux'
echo ' --macos create binary for macOS' echo ' --macos create binary for macOS'
echo ' --windows create binary for Windows' echo ' --windows create binary for Windows'
echo ' if no targets are specified then binaries for' echo ' if no targets are specified then binaries for'
echo ' all targets are created' echo ' all targets are created'
echo ' --jvm-impl jvm implementation: hotspot or openj9'
echo ' (default: hotspot)'
echo ' --jvm-options <options>' echo ' --jvm-options <options>'
echo ' passed to java like this:' echo ' passed to java like this:'
echo ' "java <options> -jar <jar file>";' echo ' "java <options> -jar <jar file>";'
echo ' use quotes when passing multiple options' echo ' use quotes when passing multiple options'
echo " example: '-Xms512m -Xmx1024m'" echo " example: '-Xms512m -Xmx1024m'"
echo ' -s, --silent using javaw instead of java for windows'
echo ' -h, --help show this message' echo ' -h, --help show this message'
exit exit
} }
@ -57,7 +68,7 @@ function fail_with() {
fail fail
} }
# if error code is not zero fail with a message # if error code is not zero fail with a message
function fail_if() { function fail_if() {
local error_code=$1 local error_code=$1
local message=$2 local message=$2
@ -89,6 +100,22 @@ function get_this_platform() {
esac esac
} }
# platform Machine
X64=x64
AARCH64=aarch64
# returns this platform machine
function get_this_machine() {
local this_machine="$(uname -m)"
case $this_machine in
x86_64) echo $X64 ;;
aarch64) echo $AARCH64 ;;
*)
fail_with "Unsupported machine $this_machine"
;;
esac
}
# show help if no arguments specified # show help if no arguments specified
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
print_help print_help
@ -104,6 +131,18 @@ while [[ $# -gt 0 ]]; do
print_help print_help
exit exit
;; ;;
-cp|--class-path)
CLASS_PATH="$2"
shift 2
;;
--auto-class-path)
AUTO_CLASS_PATH=true
shift
;;
--spring-boot)
SPRING_BOOT_APPLICATION=true
shift
;;
-j|--java-version) -j|--java-version)
JAVA_VERSION="$2" JAVA_VERSION="$2"
JAVA_VERSION_OVERRIDEN=true JAVA_VERSION_OVERRIDEN=true
@ -113,6 +152,10 @@ while [[ $# -gt 0 ]]; do
OUTPUT_DIR_PATH="$2" OUTPUT_DIR_PATH="$2"
shift 2 shift 2
;; ;;
-p|--prefix)
PREFIX="--prefix $2"
shift 2
;;
--list) --list)
LIST_RELEASES=true LIST_RELEASES=true
shift shift
@ -137,14 +180,14 @@ while [[ $# -gt 0 ]]; do
TARGETS+=($WIN) TARGETS+=($WIN)
shift shift
;; ;;
--jvm-impl)
JVM_IMPL="$2"
shift 2
;;
--jvm-options) --jvm-options)
JVM_OPTIONS="$2" JVM_OPTIONS="$2"
shift 2 shift 2
;; ;;
-s|--silent)
SILENT=true
shift
;;
-*|--*) # unsupported options -*|--*) # unsupported options
fail_with "Unsupported option $1" fail_with "Unsupported option $1"
;; ;;
@ -157,10 +200,11 @@ done
set -- "${POSITIONAL[@]}" # restore positional arguments set -- "${POSITIONAL[@]}" # restore positional arguments
THIS_PLATFORM=$(get_this_platform) THIS_PLATFORM=$(get_this_platform)
THIS_MACHINE=$(get_this_machine)
# checks if all dependencies are available # checks if all dependencies are available
function check_deps() { function check_deps() {
local deps=( local deps=(
"awk" \ "awk" \
"curl" \ "curl" \
"file" \ "file" \
@ -213,22 +257,13 @@ if [[ $JAVA_VERSION ]] && ! java_version_is_correct $JAVA_VERSION ; then
fail_with "JDK version \"$JAVA_VERSION\" is not correct" fail_with "JDK version \"$JAVA_VERSION\" is not correct"
fi fi
JVM_IMPL_HOTSPOT=hotspot JVM_IMPL=hotspot
JVM_IMPL_OPENJ9=openj9
# validate jvm implementation LATEST_LTS=17 # latest LTS java branch
if [[ $JVM_IMPL ]] &&
[[ $JVM_IMPL != $JVM_IMPL_HOTSPOT ]] &&
[[ $JVM_IMPL != $JVM_IMPL_OPENJ9 ]]; then
fail_with "jvm implementation \"$JVM_IMPL\" is not correct"
fi
LATEST_LTS=11 # latest LTS java branch
# default options # default options
test -z $JAVA_VERSION && JAVA_VERSION=$LATEST_LTS test -z $JAVA_VERSION && JAVA_VERSION=$LATEST_LTS
test -z $TARGETS && TARGETS=($LIN $MAC $WIN) test -z $TARGETS && TARGETS=($LIN $MAC $WIN)
test -z $JVM_IMPL && JVM_IMPL=$JVM_IMPL_HOTSPOT
# returns java branch version # returns java branch version
function get_base_version() { function get_base_version() {
@ -255,27 +290,28 @@ function choose_distro_type() {
# actually choose distro type # actually choose distro type
JAVA_DISTRO_TYPE=$(choose_distro_type) JAVA_DISTRO_TYPE=$(choose_distro_type)
# generates adoptopenjdk api url # generates adoptium api url
function api_url() { function api_url() {
local request=$1 # info/binary local platform=$1 # windows/linux/macos
local platform=$2 # windows/linux/macos local architecture=$2
# adoptopenjdk uses "mac" instead of "macos" # adoptium uses "mac" instead of "macos"
if [[ $platform == "macos" ]]; then if [[ $platform == "macos" ]]; then
platform="mac" platform="mac"
fi fi
echo -n "https://api.adoptopenjdk.net/v2/\
$request/releases/openjdk$JAVA_VERSION_BASE?\ echo -n "https://api.adoptium.net/v3/assets/feature_releases/\
openjdk_impl=$JVM_IMPL&\ $JAVA_VERSION_BASE/ga?architecture=$architecture&heap_size=normal&image_type=jdk&\
os=$platform&\ os=$platform&page=0&page_size=20&project=$JAVA_DISTRO_TYPE&\
arch=x64&\ sort_method=DEFAULT&sort_order=DESC&vendor=eclipse"
type=$JAVA_DISTRO_TYPE"
} }
# requests info about all releases for given platform and java branch # requests info about all releases for given platform and java branch
function fetch_distro_info() { function fetch_distro_info() {
local platform=$1 # platform ID local platform=$1 # platform ID
local branch=$2 # 8/9/10/11... local architecture=$2
curl -s $(api_url info $platform) local branch=$3 # 8/9/10/11...
curl -s $(api_url $platform $architecture)
fail_if $? "Failed to fetch java $branch info" fail_if $? "Failed to fetch java $branch info"
} }
@ -305,7 +341,7 @@ function list_releases() {
local matched local matched
local printed local printed
local platform="linux" # just picked any local platform="linux" # just picked any
info=$(fetch_distro_info $platform $JAVA_VERSION_BASE) info=$(fetch_distro_info $platform $X64 $JAVA_VERSION_BASE)
matched=$(find_matched_versions "$info" $JAVA_VERSION) matched=$(find_matched_versions "$info" $JAVA_VERSION)
if [[ $matched ]]; then if [[ $matched ]]; then
echo "Releases that match $JAVA_VERSION:" echo "Releases that match $JAVA_VERSION:"
@ -326,8 +362,8 @@ if [[ $LIST_RELEASES ]]; then
exit exit
fi fi
JAR_FILE_BASE_NAME=$(basename -- "$JAR") # "my-app.jAr" JAR_FILE_BASE_NAME=$(basename -- "$JAR") # "my-app.jar"
JAR_EXTENSION="${JAR_FILE_BASE_NAME##*.}" # "jAr" JAR_EXTENSION="${JAR_FILE_BASE_NAME##*.}" # "jar"
JAR_EXTENSION_LOWERCASE=$(printf "%s" "$JAR_EXTENSION" | tr '[:upper:]' '[:lower:]') # "jar" JAR_EXTENSION_LOWERCASE=$(printf "%s" "$JAR_EXTENSION" | tr '[:upper:]' '[:lower:]') # "jar"
JAR_NAME="${JAR_FILE_BASE_NAME%.*}" # "my-app" JAR_NAME="${JAR_FILE_BASE_NAME%.*}" # "my-app"
@ -347,9 +383,10 @@ if ([[ $(file $JAR) != *"Java"* ]] && # it could be "Java archive data" or "Java
fi fi
# even if this platform is not targeted, we still need # even if this platform is not targeted, we still need
# a JDK for this platform to optimize JDKs for other platforms # a JDK for this platform to optimize JDKs for other platforms
TARGETS_TO_CACHE=${TARGETS[@]} TARGETS_TO_CACHE=${TARGETS[@]}
if [[ $JAVA_DISTRO_TYPE == $DISTRO_TYPE_JDK ]] && # if usind JDK (not JRE) if [[ $THIS_MACHINE == $X64 ]] && # if architecture is x86
[[ $JAVA_DISTRO_TYPE == $DISTRO_TYPE_JDK ]] && # and if using JDK (not JRE)
[[ ${TARGETS[@]} != *"$THIS_PLATFORM"* ]]; then # and this platform is not targeted [[ ${TARGETS[@]} != *"$THIS_PLATFORM"* ]]; then # and this platform is not targeted
TARGETS_TO_CACHE+=($THIS_PLATFORM) TARGETS_TO_CACHE+=($THIS_PLATFORM)
fi fi
@ -369,6 +406,11 @@ fi
JAVA_DOWNLOAD_PATH=$CACHE_PATH/$JAVA_DISTRO_TYPE/$JVM_IMPL JAVA_DOWNLOAD_PATH=$CACHE_PATH/$JAVA_DISTRO_TYPE/$JVM_IMPL
BUNDLES_PATH=$CACHE_PATH/bundle # prepare bundles here BUNDLES_PATH=$CACHE_PATH/bundle # prepare bundles here
# path for extracted jar files
EXTRACTED_JAR_PATH=$CACHE_PATH/app-jar # prepare bundles here
mkdir -p ${EXTRACTED_JAR_PATH}
trap 'rm -rf ${EXTRACTED_JAR_PATH}' EXIT
DIR="$(pwd -P)" # execution directory path DIR="$(pwd -P)" # execution directory path
# final binaries created in WARPED_TEMP_PATH and then moved to WARPED_PATH # final binaries created in WARPED_TEMP_PATH and then moved to WARPED_PATH
@ -390,11 +432,11 @@ JAVA_DIST='"$BUNDLED_DISTRO_SUBDIR"'
JAR='"$JAR_NAME"'.jar JAR='"$JAR_NAME"'.jar
DIR="$(cd "$(dirname "$0")" ; pwd -P)" DIR="$(cd "$(dirname "$0")" ; pwd -P)"
JAVA=$DIR/$JAVA_DIST/bin/java JAVA=$DIR/$JAVA_DIST/bin/'"$JAVA_EXEC"'
JAR_PATH=$DIR/$JAR JAR_PATH=$DIR/$JAR
exec "$JAVA" '"$JVM_OPTIONS"' -jar "$JAR_PATH" "$@" exec "$JAVA" '"$JVM_OPTIONS"' -jar "$JAR_PATH" "$@"
' '
} }
# prints a launcher for windows cmd # prints a launcher for windows cmd
@ -407,12 +449,12 @@ SETLOCAL
SET "JAVA_DIST='"$BUNDLED_DISTRO_SUBDIR"'" SET "JAVA_DIST='"$BUNDLED_DISTRO_SUBDIR"'"
SET "JAR='"$JAR_NAME"'.jar" SET "JAR='"$JAR_NAME"'.jar"
SET "JAVA=%~dp0\%JAVA_DIST%\bin\java.exe" SET "JAVA=%~dp0\%JAVA_DIST%\bin\'"$JAVA_EXEC"'
SET "JAR_PATH=%~dp0\%JAR%" SET "JAR_PATH=%~dp0\%JAR%"
CALL %JAVA% '"$JVM_OPTIONS"' -jar %JAR_PATH% %* START %JAVA% '"$JVM_OPTIONS"' -jar %JAR_PATH% %*
EXIT /B %ERRORLEVEL% EXIT /B %ERRORLEVEL%
' '
} }
# these files are success markers # these files are success markers
@ -422,8 +464,9 @@ MARKER_UNPACKED="unpacked" # after runtime uncompress
# returns latest cached version that matches version specified by user # returns latest cached version that matches version specified by user
function find_latest_cached() { function find_latest_cached() {
local platform=$1 local platform=$1
local user_version=$2 local architecture=$2
local platform_dir=$JAVA_DOWNLOAD_PATH/$platform/ local user_version=$3
local platform_dir=$JAVA_DOWNLOAD_PATH/$platform/$architecture
# turning something like "11.0.1+13" into regexp like "^11\.0\.1\+13" # turning something like "11.0.1+13" into regexp like "^11\.0\.1\+13"
local pattern="^"$(echo $user_version \ local pattern="^"$(echo $user_version \
| sed -e 's/\./\\\./g' -e 's/\+/\\\+/g') | sed -e 's/\./\\\./g' -e 's/\+/\\\+/g')
@ -446,7 +489,7 @@ function find_latest_cached() {
# finds latest concrete distro version that matches version specified by user # finds latest concrete distro version that matches version specified by user
function find_latest_version() { function find_latest_version() {
local info=$1 # info fetched from AdoptOpenJDK local info=$1 # info fetched from Adoptium
local user_version=$2 # version supplied by user is a template local user_version=$2 # version supplied by user is a template
local matched_version # latest version that matches the template local matched_version # latest version that matches the template
local versions # all versions local versions # all versions
@ -472,12 +515,11 @@ function find_latest_version() {
# finds direct link to download concrete runtime version # finds direct link to download concrete runtime version
function find_distro_link() { function find_distro_link() {
local info=$1 # info fetched from AdoptOpenJDK local info=$1 # info fetched from Adoptium
local version=$2 # concrete distro version like "11.0.2+9" local version=$2 # concrete distro version like "11.0.2+9"
local link=$(echo "$info" \ local link=$(echo "$info" \
| grep -B13 "\"heap_size\": \"normal\"" \ | grep -B14 "\"release_name\": \"jdk-$version\"" \
| grep -B11 "\"semver\": \"$version\"" \ | grep "\"link\":" \
| grep "binary_link" \
| sort --reverse \ | sort --reverse \
| head -n 1 \ | head -n 1 \
| awk '{print $2}' \ | awk '{print $2}' \
@ -491,9 +533,11 @@ function find_distro_link() {
# downloads runtime distro # downloads runtime distro
function download_distro() { function download_distro() {
local platform=$1 local platform=$1
local version=$2 local architecture=$2
local link=$3 local version=$3
local download_dir=$JAVA_DOWNLOAD_PATH/$platform/$version local link=$4
local download_dir=$JAVA_DOWNLOAD_PATH/$platform/$architecture/$version
echo "Download link: $link"
echo "Downloading $JVM_IMPL-$JAVA_DISTRO_TYPE-$version-$platform..." echo "Downloading $JVM_IMPL-$JAVA_DISTRO_TYPE-$version-$platform..."
rm -rf "$download_dir" rm -rf "$download_dir"
mkdir -p "$download_dir" mkdir -p "$download_dir"
@ -507,58 +551,64 @@ function download_distro() {
) )
} }
# ensures required distro is in cache # ensures required distro is in cache
function ensure_distro_cached() { function ensure_distro_cached() {
local platform=$1 local platform=$1
local architecture=$2
local distro_info local distro_info
local distro_link local distro_link
if [[ -z $PULL ]]; then if [[ -z $PULL ]]; then
if [[ -z $JAVA_VERSION_OVERRIDEN ]]; then if [[ -z $JAVA_VERSION_OVERRIDEN ]]; then
if [[ ! $(find_latest_cached $platform $LATEST_LTS) ]]; then if [[ ! $(find_latest_cached $platform $architecture $LATEST_LTS) ]]; then
distro_info=$(fetch_distro_info $platform $LATEST_LTS) distro_info=$(fetch_distro_info $platform $architecture $LATEST_LTS)
CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $LATEST_LTS) CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $LATEST_LTS)
distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION) distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION)
download_distro $platform $CONCRETE_JAVA_VERSION "$distro_link" download_distro $platform $architecture $CONCRETE_JAVA_VERSION "$distro_link"
else else
CONCRETE_JAVA_VERSION=$(find_latest_cached $platform $LATEST_LTS) CONCRETE_JAVA_VERSION=$(find_latest_cached $platform $architecture $LATEST_LTS)
fi fi
else else
if [[ ! $(find_latest_cached $platform $JAVA_VERSION) ]]; then if [[ ! $(find_latest_cached $platform $architecture $JAVA_VERSION) ]]; then
distro_info=$(fetch_distro_info $platform $JAVA_VERSION_BASE) distro_info=$(fetch_distro_info $platform $architecture $JAVA_VERSION_BASE)
CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $JAVA_VERSION) CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $JAVA_VERSION)
distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION) distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION)
download_distro $platform $CONCRETE_JAVA_VERSION "$distro_link" download_distro $platform $architecture $CONCRETE_JAVA_VERSION "$distro_link"
else else
CONCRETE_JAVA_VERSION=$(find_latest_cached $platform $JAVA_VERSION) CONCRETE_JAVA_VERSION=$(find_latest_cached $platform $architecture $JAVA_VERSION)
fi fi
fi fi
else else
if [[ -z $JAVA_VERSION ]]; then if [[ -z $JAVA_VERSION ]]; then
distro_info=$(fetch_distro_info $platform $LATEST_LTS) distro_info=$(fetch_distro_info $platform $architecture $LATEST_LTS)
CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $LATEST_LTS) CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $LATEST_LTS)
else else
distro_info=$(fetch_distro_info $platform $JAVA_VERSION_BASE) distro_info=$(fetch_distro_info $platform $architecture $JAVA_VERSION_BASE)
CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $JAVA_VERSION) CONCRETE_JAVA_VERSION=$(find_latest_version "$distro_info" $JAVA_VERSION)
fi fi
if [[ ! $(find_latest_cached $platform $CONCRETE_JAVA_VERSION) ]]; then if [[ ! $(find_latest_cached $platform $architecture $CONCRETE_JAVA_VERSION) ]]; then
distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION) distro_link=$(find_distro_link "$distro_info" $CONCRETE_JAVA_VERSION)
download_distro $platform $CONCRETE_JAVA_VERSION "$distro_link" download_distro $platform $architecture $CONCRETE_JAVA_VERSION "$distro_link"
fi fi
fi fi
} }
# actually ensure required distro is in cache # actually ensure required distro is in cache
for target in ${TARGETS_TO_CACHE[@]}; do for target in ${TARGETS_TO_CACHE[@]}; do
ensure_distro_cached $target ensure_distro_cached $target $X64
done done
if [[ $THIS_MACHINE == $AARCH64 ]]; then
ensure_distro_cached $THIS_PLATFORM $AARCH64
fi
UNPACKED_SUBDIR="distro" UNPACKED_SUBDIR="distro"
# ensures required distro uncompressed # ensures required distro uncompressed
function ensure_distro_unpacked() { function ensure_distro_unpacked() {
local platform=$1 local platform=$1
local version=$2 local architecture=$2
local download_dir=$JAVA_DOWNLOAD_PATH/$platform/$version local version=$3
local download_dir=$JAVA_DOWNLOAD_PATH/$platform/$architecture/$version
local unpacked_dir=$download_dir/$UNPACKED_SUBDIR local unpacked_dir=$download_dir/$UNPACKED_SUBDIR
if [[ ! -e $download_dir/$MARKER_UNPACKED ]]; then if [[ ! -e $download_dir/$MARKER_UNPACKED ]]; then
echo "Uncompressing $JVM_IMPL-$JAVA_DISTRO_TYPE-$version-$platform" echo "Uncompressing $JVM_IMPL-$JAVA_DISTRO_TYPE-$version-$platform"
@ -607,12 +657,17 @@ function ensure_distro_unpacked() {
fi fi
} }
# actually ensure required distro uncompressed # actually ensure required distro uncompressed
for target in ${TARGETS[@]}; do for target in ${TARGETS[@]}; do
ensure_distro_unpacked $target $CONCRETE_JAVA_VERSION ensure_distro_unpacked $target $X64 $CONCRETE_JAVA_VERSION
done done
JDK_PATH=$JAVA_DOWNLOAD_PATH/$THIS_PLATFORM/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR # actually ensure required distro for build is uncompressed when it is not x64
if [[ $THIS_MACHINE == $AARCH64 ]]; then
ensure_distro_unpacked $THIS_PLATFORM $AARCH64 $CONCRETE_JAVA_VERSION
fi
JDK_PATH=$JAVA_DOWNLOAD_PATH/$THIS_PLATFORM/$THIS_MACHINE/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR
JLINK=$JDK_PATH/bin/jlink JLINK=$JDK_PATH/bin/jlink
JDEPS=$JDK_PATH/bin/jdeps JDEPS=$JDK_PATH/bin/jdeps
@ -620,18 +675,43 @@ JDEPS=$JDK_PATH/bin/jdeps
if [[ $JAVA_DISTRO_TYPE == $DISTRO_TYPE_JDK ]]; then if [[ $JAVA_DISTRO_TYPE == $DISTRO_TYPE_JDK ]]; then
echo "Analyzing dependencies..." echo "Analyzing dependencies..."
# TODO check for errors # TODO check for errors
MODULES=$("$JDEPS" --print-module-deps "$JAR" | grep -v Warning) # TODO If JAVA_VERSION is not an INT it will throw an error
if [ -n "$CLASS_PATH" ]
then
echo "Using given classpaths: $CLASS_PATH"
MODULES=$($JDEPS --class-path=$CLASS_PATH --print-module-deps --ignore-missing-deps --multi-release $JAVA_VERSION_BASE $JAR | grep -v Warning)
elif [ "$AUTO_CLASS_PATH" ]
then
echo "Extracting jar file to get classpath"
unzip -q "${JAR}" -d "${EXTRACTED_JAR_PATH}"
echo "Fetching modules"
MODULES=$($JDEPS --ignore-missing-deps --print-module-deps --recursive --multi-release $JAVA_VERSION_BASE -quiet --class-path=${EXTRACTED_JAR_PATH}/* --module-path=${EXTRACTED_JAR_PATH}/* $JAR | grep -v Warning)
elif [ "$SPRING_BOOT_APPLICATION" ]
then
echo "Extracting Spring Boot jar file to get classpath"
unzip -q "${JAR}" -d "${EXTRACTED_JAR_PATH}"
echo "Fetching modules"
MODULES=$($JDEPS --ignore-missing-deps --print-module-deps --recursive --multi-release $JAVA_VERSION_BASE -quiet --class-path=${EXTRACTED_JAR_PATH}/BOOT-INF/lib/* --module-path=${EXTRACTED_JAR_PATH}/BOOT-INF/lib/BOOT-INF/lib/* $JAR | grep -v Warning)
else
echo "Fetch modules with default behavior"
MODULES=$("$JDEPS" --print-module-deps --ignore-missing-deps --multi-release $JAVA_VERSION_BASE "$JAR" | grep -v Warning)
fi
fi fi
# creates minimized runtime for the platform # creates minimized runtime for the platform
function create_optimized_runtime() { function create_optimized_runtime() {
local platform=$1 local platform=$1
local jmods=$JAVA_DOWNLOAD_PATH/$platform/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR/jmods local machine=$2
local jmods=$JAVA_DOWNLOAD_PATH/$platform/$machine/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR/jmods
local strip_debug=strip-debug
echo "Creating minimal runtime for $platform..." echo "Creating minimal runtime for $platform..."
if [[ $JAVA_VERSION_BASE -ge 13 ]]; then
strip_debug=strip-java-debug-attributes
fi
"$JLINK" \ "$JLINK" \
--no-header-files \ --no-header-files \
--no-man-pages \ --no-man-pages \
--strip-debug \ --$strip_debug \
--module-path "$jmods" \ --module-path "$jmods" \
--add-modules $MODULES \ --add-modules $MODULES \
--output "$BUNDLES_PATH/$platform/$BUNDLED_DISTRO_SUBDIR" --output "$BUNDLES_PATH/$platform/$BUNDLED_DISTRO_SUBDIR"
@ -641,12 +721,20 @@ function create_optimized_runtime() {
# creates warp bundle for the platform # creates warp bundle for the platform
function create_bundle() { function create_bundle() {
local platform=$1 local platform=$1
local machine=$2
if [[ $SILENT ]] && [[ $platform == $WIN ]]; then
JAVA_EXEC=javaw
else
JAVA_EXEC=java
fi
case $JAVA_DISTRO_TYPE in case $JAVA_DISTRO_TYPE in
$DISTRO_TYPE_JDK) $DISTRO_TYPE_JDK)
create_optimized_runtime $platform create_optimized_runtime $platform $machine
;; ;;
$DISTRO_TYPE_JRE) $DISTRO_TYPE_JRE)
mkdir -p "$BUNDLES_PATH/$platform/$BUNDLED_DISTRO_SUBDIR" mkdir -p "$BUNDLES_PATH/$platform/$machine/$BUNDLED_DISTRO_SUBDIR"
cp -r "$JAVA_DOWNLOAD_PATH/$platform/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR"/* \ cp -r "$JAVA_DOWNLOAD_PATH/$platform/$CONCRETE_JAVA_VERSION/$UNPACKED_SUBDIR"/* \
"$BUNDLES_PATH/$platform/$BUNDLED_DISTRO_SUBDIR" "$BUNDLES_PATH/$platform/$BUNDLED_DISTRO_SUBDIR"
;; ;;
@ -664,7 +752,7 @@ function create_bundle() {
rm -rf "$BUNDLES_PATH" rm -rf "$BUNDLES_PATH"
# actually create bundles for all targets # actually create bundles for all targets
for target in ${TARGETS[@]}; do for target in ${TARGETS[@]}; do
create_bundle $target create_bundle $target $X64
done done
# creates binaries and archives for all targets # creates binaries and archives for all targets
@ -675,8 +763,11 @@ function warp_targets() {
echo "Warping for $LIN..." echo "Warping for $LIN..."
mkdir -p "$WARPED_TEMP_PATH/$LIN" mkdir -p "$WARPED_TEMP_PATH/$LIN"
warp-packer \ warp-packer \
pack \
--unique-id \
$PREFIX \
--arch linux-x64 \ --arch linux-x64 \
--input_dir "$BUNDLES_PATH/$LIN" \ --input-dir "$BUNDLES_PATH/$LIN" \
--exec "$LAUNCHER_NAME.sh" \ --exec "$LAUNCHER_NAME.sh" \
--output "$WARPED_TEMP_PATH/$LIN/$APP_NAME" \ --output "$WARPED_TEMP_PATH/$LIN/$APP_NAME" \
&> /dev/null &> /dev/null
@ -693,8 +784,11 @@ function warp_targets() {
echo "Warping for $MAC..." echo "Warping for $MAC..."
mkdir -p "$WARPED_TEMP_PATH/$MAC" mkdir -p "$WARPED_TEMP_PATH/$MAC"
warp-packer \ warp-packer \
pack \
--unique-id \
$PREFIX \
--arch macos-x64 \ --arch macos-x64 \
--input_dir "$BUNDLES_PATH/$MAC" \ --input-dir "$BUNDLES_PATH/$MAC" \
--exec "$LAUNCHER_NAME.sh" \ --exec "$LAUNCHER_NAME.sh" \
--output "$WARPED_TEMP_PATH/$MAC/$APP_NAME" \ --output "$WARPED_TEMP_PATH/$MAC/$APP_NAME" \
&> /dev/null &> /dev/null
@ -711,8 +805,11 @@ function warp_targets() {
echo "Warping for $WIN..." echo "Warping for $WIN..."
mkdir -p "$WARPED_TEMP_PATH/$WIN" mkdir -p "$WARPED_TEMP_PATH/$WIN"
warp-packer \ warp-packer \
pack \
--unique-id \
$PREFIX \
--arch windows-x64 \ --arch windows-x64 \
--input_dir "$BUNDLES_PATH/$WIN" \ --input-dir "$BUNDLES_PATH/$WIN" \
--exec "$LAUNCHER_NAME.cmd" \ --exec "$LAUNCHER_NAME.cmd" \
--output "$WARPED_TEMP_PATH/$WIN/$APP_NAME.exe" \ --output "$WARPED_TEMP_PATH/$WIN/$APP_NAME.exe" \
&> /dev/null &> /dev/null
@ -729,7 +826,7 @@ function warp_targets() {
mv "$WARPED_TEMP_PATH/$WIN/$APP_NAME.exe" "$WARPED_PATH/$APP_NAME-windows-x64.exe" mv "$WARPED_TEMP_PATH/$WIN/$APP_NAME.exe" "$WARPED_PATH/$APP_NAME-windows-x64.exe"
rmdir "$WARPED_TEMP_PATH/$WIN" rmdir "$WARPED_TEMP_PATH/$WIN"
fi fi
rmdir "$WARPED_TEMP_PATH" rmdir "$WARPED_TEMP_PATH"
} }