Now doesn't require any Ubuntu packages to be installed in order to build (java, ant, i2p). Produces a distribution with zero dependencies.

pull/1/head
knaccc 5 years ago
parent 385917a7f4
commit 1437610e5b

@ -2,45 +2,29 @@
This project will build a native launcher. The launcher will include the I2P router, a SAM listener and a minimal JVM. This project will build a native launcher. The launcher will include the I2P router, a SAM listener and a minimal JVM.
## Prerequisites ## Building the launcher
This project requires the JAR files and base configuration dir from an existing I2P installation.
To install I2P on Ubuntu so that these files are available to you, type:
``` retrieve this project from git:
sudo apt-add-repository ppa:i2p-maintainers/i2p
sudo apt-get update
sudo apt-get install i2p
```
Then copy the following 6 JAR files from the I2P installation to the import/lib directory in your clone of this GitHub project: `git clone https://github.com/knaccc/embedded-i2p-java-router-with-sam.git`
``` Note that the current version of this script uses jdk-11.0.2. If this version of Java becomes no longer available for
mkdir -p import/lib download, then update the references to jdk-11.0.2 in this folder structure to the later version.
for i in i2p.jar mstreaming.jar router.jar sam.jar streaming.jar gnu-getopt.jar libintl.jar; do cp /usr/share/i2p/lib/$i import/lib/; done
mv import/lib/gnu-getopt.jar import/lib/gnugetopt.jar
```
You will need OpenJDK 11 installed: Run the `bin/build-all.sh` script, which will in turn call the following scripts:
`sudo apt install openjdk-11-jdk-headless` 1. `bin/import-packages.sh` to retrieve the I2P Java sources, OpenJDK and the Ant build tool
## Building the launcher 2. `bin/build-original-i2p.sh` to build the i2p project retrieved from the I2P repository
`bin/build-launcher.sh` 3. `build-launcher.sh` to convert the imported JARs to modules, compile the Java source code in this project, and then use
the jlink tool to build a zero-dependency platform-specific launcher.
This will convert the imported JARs to modules, compile the Java source code in this project, and then use the jlink tool
to build a platform-specific launcher executable.
## Running the launcher ## Running the launcher
The launcher will need access to the /usr/share/i2p base directory. It will create a .i2p directory for configuration
files in the current user's home directory if it does not already exist.
To run the router, type: To run the router, type:
`target/router/bin/router` `target/router/bin/launch.sh`
If it launches successfully, you'll see the message: If it launches successfully, you'll see the message:
@ -49,6 +33,3 @@ If it launches successfully, you'll see the message:
## Check that the I2P router is running and that it is listening for SAM connections ## Check that the I2P router is running and that it is listening for SAM connections
`fuser 7656/tcp` `fuser 7656/tcp`
## Todo
Need to determine the most minimal base configuration directory contents, and include it as part of this project.

@ -0,0 +1,13 @@
#!/bin/bash
basedir=$(dirname $(dirname $(readlink -fm $0)))
# retrieve the I2P Java sources, OpenJDK and the Ant build tool
$basedir/bin/import-packages.sh
# build the i2p project retrieved from the I2P repository
$basedir/bin/build-original-i2p.sh
# convert the imported JARs to modules, compile the Java source code in this project, and then use the jlink tool
# to build a zero-dependency platform-specific launcher
$basedir/bin/build-launcher.sh

@ -2,20 +2,30 @@
basedir=$(dirname $(dirname $(readlink -fm $0))) basedir=$(dirname $(dirname $(readlink -fm $0)))
export JAVA_HOME=`realpath $basedir/import/jdk-11.0.2`
# convert the jar files from an existing I2P build into modules suitable for use with jlink # convert the jar files from an existing I2P build into modules suitable for use with jlink
$basedir/bin/convert-jars-to-modules.sh $basedir/bin/convert-jars-to-modules.sh
# compile the Main class that starts the I2P router and SAM listener # compile the Main class that starts the I2P router and SAM listener
echo "*** Compiling Main class" echo "*** Compiling Main class"
javac --module-path import/lib -d target/classes $(find src -name '*.java') $JAVA_HOME/bin/javac --module-path import/lib -d target/classes $(find src -name '*.java')
# package as a modular jar # package as a modular jar
echo "*** Packaging as a modular jar" echo "*** Packaging as a modular jar"
jar --create --file target/org.getmonero.i2p.embedded.jar --main-class org.getmonero.i2p.embedded.Main -C target/classes . $JAVA_HOME/bin/jar --create --file target/org.getmonero.i2p.embedded.jar --main-class org.getmonero.i2p.embedded.Main -C target/classes .
# create an OS specific launcher which will bundle together the code and a minimal JVM # create an OS specific launcher which will bundle together the code and a minimal JVM
echo "*** Performing jlink" echo "*** Performing jlink"
jlink --module-path target/modules:target/org.getmonero.i2p.embedded.jar --add-modules org.getmonero.i2p.embedded --launcher router=org.getmonero.i2p.embedded --output target/router --strip-debug --compress 2 --no-header-files --no-man-pages $JAVA_HOME/bin/jlink --module-path target/modules:target/org.getmonero.i2p.embedded.jar --add-modules org.getmonero.i2p.embedded --launcher router=org.getmonero.i2p.embedded --output target/router --strip-debug --compress 2 --no-header-files --no-man-pages
cp $basedir/resources/launch.sh $basedir/target/router/bin/
cp -r $basedir/import/i2p.base $basedir/target/router/
mkdir -p $basedir/target/router/i2p.config
mkdir -p $basedir/dist/
mv $basedir/target/router $basedir/dist/
echo "*** Done ***" echo "*** Done ***"
echo "To run, type: target/router/bin/router" echo "To run, type: dist/router/bin/launch.sh"

@ -0,0 +1,27 @@
#!/bin/bash
basedir=$(dirname $(dirname $(readlink -fm $0)))
cd $basedir/import
export JAVA_HOME=`realpath $basedir/import/jdk-11.0.2`
# build the jars we're going to modularize
cd $basedir/import/i2p.i2p
$basedir/import/apache-ant-1.10.5/bin/ant pkg
$basedir/import/apache-ant-1.10.5/bin/ant updaterWithJbigi
cd ..
# copy the jars that we're going to modularize
mkdir -p $basedir/import/lib
for i in i2p.jar mstreaming.jar router.jar sam.jar streaming.jar; do cp $basedir/import/i2p.i2p/build/$i $basedir/import/lib/; done
# build a minimal i2p.base dir
mkdir -p $basedir/import/i2p.base
cp $basedir/import/i2p.i2p/build/jbigi.jar $basedir/import/i2p.base/
for i in blocklist.txt hosts.txt certificates; do cp -r $basedir/import/i2p.i2p/installer/resources/$i $basedir/import/i2p.base/; done
mkdir -p $basedir/import/i2p.base/geoip
for i in continents.txt countries.txt; do cp -r $basedir/import/i2p.i2p/installer/resources/$i $basedir/import/i2p.base/geoip/; done

@ -2,6 +2,8 @@
basedir=$(dirname $(dirname $(readlink -fm $0))) basedir=$(dirname $(dirname $(readlink -fm $0)))
export JAVA_HOME=`realpath $basedir/import/jdk-11.0.2`
jarPaths=`find $basedir/import/lib -name '*.jar'` jarPaths=`find $basedir/import/lib -name '*.jar'`
mkdir -p $basedir/target/modules mkdir -p $basedir/target/modules
@ -10,12 +12,12 @@ rm -f $basedir/target/modules/*
for jarPath in $jarPaths; do for jarPath in $jarPaths; do
moduleName=$(basename "${jarPath%.*}") moduleName=$(basename "${jarPath%.*}")
echo "*** Determining dependencies for $moduleName" echo "*** Determining dependencies for $moduleName"
jdeps --module-path $basedir/import/lib --add-modules=ALL-MODULE-PATH --generate-module-info $basedir/target/module-info $jarPath $JAVA_HOME/bin/jdeps --module-path $basedir/import/lib --add-modules=ALL-MODULE-PATH --generate-module-info $basedir/target/module-info $jarPath
done done
for jarPath in $jarPaths; do for jarPath in $jarPaths; do
moduleName=$(basename "${jarPath%.*}") moduleName=$(basename "${jarPath%.*}")
echo "*** Creating new modular jar for $moduleName" echo "*** Creating new modular jar for $moduleName"
javac --module-path $basedir/import/lib --patch-module $moduleName=$jarPath $basedir/target/module-info/$moduleName/module-info.java $JAVA_HOME/bin/javac --module-path $basedir/import/lib --patch-module $moduleName=$jarPath $basedir/target/module-info/$moduleName/module-info.java
cp $jarPath $basedir/target/modules/ cp $jarPath $basedir/target/modules/
jar uf $basedir/target/modules/${moduleName}.jar -C $basedir/target/module-info/$moduleName module-info.class $JAVA_HOME/bin/jar uf $basedir/target/modules/${moduleName}.jar -C $basedir/target/module-info/$moduleName module-info.class
done done

@ -0,0 +1,14 @@
#!/bin/bash
basedir=$(dirname $(dirname $(readlink -fm $0)))
mkdir $basedir/import
cd $basedir/import
git clone https://github.com/i2p/i2p.i2p.git
wget https://download.java.net/java/GA/jdk11/7/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
wget https://www-us.apache.org/dist//ant/binaries/apache-ant-1.10.5-bin.tar.gz
tar zxvf openjdk-11.0.2_linux-x64_bin.tar.gz
tar zxvf apache-ant-1.10.5-bin.tar.gz

@ -0,0 +1,5 @@
#!/bin/bash
basedir=$(dirname $(dirname $(readlink -fm $0)))
$basedir/bin/java -cp $basedir/i2p.base/jbigi.jar -m org.getmonero.i2p.embedded --i2p.dir.base=$basedir/i2p.base --i2p.dir.config=$basedir/i2p.config

@ -4,7 +4,5 @@ module org.getmonero.i2p.embedded {
requires streaming; requires streaming;
requires router; requires router;
requires sam; requires sam;
requires libintl;
requires gnugetopt;
requires jdk.crypto.ec; requires jdk.crypto.ec;
} }
Loading…
Cancel
Save