diff --git a/build.properties b/build.properties index d31351d0b824cb0f384338606aba67f950f38448..8ee39009bf7974679e9663f602e51b838fd40ed2 100644 --- a/build.properties +++ b/build.properties @@ -46,6 +46,27 @@ javac.version=1.6 # This one keeps gcj a lot quieter #javac.compilerargs=-warn:-unchecked,raw,unused,serial +# +# Note to packagers, embedders, distributors: +# +# Strictly speaking, you must either use the compiler for the minimum Java version you are +# targeting (default 1.6, see above), or specify a bootclasspath, which means you need +# the JRE for the target version installed as well. +# +# However, in practice, you can compile with 1.7 and target 1.6 without specifying a bootclasspath, +# and it all works fine. +# +# But you cannot compile with 1.8 and target 1.6 or 1.7 without bootclasspath, +# or your users will get runtime errors. +# Below is an example of a bootclasspath that works on Ubuntu. +# +# For more info: +# http://zzz.i2p/topics/1668 +# https://gist.github.com/AlainODea/1375759b8720a3f9f094 +# +#javac.compilerargs=-bootclasspath /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jce.jar + + ### UnitTests ## # Location of the libraries required for the ScalaTest tests. # Define this in override.properties or pass in on the command line. diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java index 3ff080fd7fbbfcdc80f4adbec6834e2ed1d9bb52..b771589a1f7474f0d408be4a5b52571007bcc039 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java @@ -285,6 +285,26 @@ class BuildExecutor implements Runnable { public void run() { _isRunning = true; + try { + run2(); + } catch (NoSuchMethodError nsme) { + // http://zzz.i2p/topics/1668 + // https://gist.github.com/AlainODea/1375759b8720a3f9f094 + // at ObjectCounter.objects() + String s = "Fatal error:" + + "\nJava 8 compiler used with JRE version " + System.getProperty("java.version") + + " and no bootclasspath specified." + + "\nUpdate to Java 8 or contact packager." + + "\nStop I2P now, it will not build tunnels."; + _log.log(Log.CRIT, s, nsme); + System.out.println(s); + throw nsme; + } finally { + _isRunning = false; + } + } + + private void run2() { List<TunnelPool> wanted = new ArrayList<TunnelPool>(MAX_CONCURRENT_BUILDS); List<TunnelPool> pools = new ArrayList<TunnelPool>(8); @@ -423,7 +443,6 @@ class BuildExecutor implements Runnable { if (_log.shouldLog(Log.WARN)) _log.warn("Done building"); - _isRunning = false; } /**