The magic %classpath
adds jars to the kernel. And the magics %import
and %unimport
control which classes are visible by default in your code (the regular import
command is local to the cell where it runs.
These magics work in all the BeakerX JVM kernels.
This first cell shows that you get an error if you try to import a class not built-in to BeakerX:
In [ ]:
import com.example.Demo
Then load a jar into the kernel:
In [ ]:
%classpath add jar ../resources/jar/demo.jar
After that, it imports and runs:
In [ ]:
import com.example.Demo
Demo demo = new Demo();
println demo.getObjectTest()
You can add multiple jars. Wildcards also work, like they normally do in the classpath (in this case the code could say ../resources/jar/*
).
In [ ]:
%classpath add jar ../resources/jar/demo.jar
%classpath add jar ../resources/jar/BeakerXClasspathTest.jar
println com.example.Demo.staticTest();
import com.example.Demo
Demo demo = new Demo();
println demo.getObjectTest()
import com.beaker.BeakerXClasspathTest
BeakerXClasspathTest t = new BeakerXClasspathTest();
println com.beaker.BeakerXClasspathTest.staticTest;
println t.getObjectTest();
OutputCell.HIDDEN
The source code for these jars is in the repository. See Demo.java, and BeakerXClasspathTest.java
With no arguments the classpath magic prints-out all loaded jars:
In [ ]:
%classpath
Groovy has a dependency manager called Grape built-in and you can access it as follows:
In [ ]:
@Grab(group='com.google.code.gson', module='gson', version='2.2.4')
import com.google.gson.GsonBuilder
new GsonBuilder().create().toJson("Hello", System.out)
The %classpath
magic also supports loading from maven central:
In [ ]:
%classpath add mvn com.google.code.gson gson 2.2.4
new com.google.gson.GsonBuilder().create().toJson("Hello", System.out)
You can also use gradle-like syntax to load dependencies:
In [ ]:
%classpath add mvn com.sun.jersey:jersey-core:1.19.4
import com.sun.jersey.api.uri.UriBuilderImpl
return new UriBuilderImpl()
.path("http://beakerx.com/")
.path("documentation")
.build();
Most dependencies are JARs, but a few such as Jena are POMs. They can be loaded like this:
In [ ]:
%classpath add mvn org.apache.jena apache-jena-libs 3.6.0 pom
model = org.apache.jena.rdf.model.ModelFactory.createDefaultModel()
In [ ]:
In [ ]:
%classpath config resolver repository.spring.snapshot http://repo.spring.io/snapshot
In [ ]:
%classpath add mvn org.springframework spring-context 5.0.3.BUILD-SNAPSHOT
In [ ]:
%%classpath add mvn
org.slf4j slf4j-api 1.7.25
org.slf4j slf4j-nop 1.7.25
In [ ]:
location = "../resources/jar/"
In [ ]:
%classpath add dynamic location + "demo.jar"
In [ ]:
%classpath add dynamic [location + "demo.jar", location + "BeakerXClasspathTest.jar"]
Maven normally downloads jars to ~/.m2/repository/
. But unfortunately this cache is not safe for concurrent access.
To avoid corrupting it, BeakerX by default uses its own Maven cache in the conda environment at $(CONDA_PREFIX)/share/beakerx/maven
. The M2_HOME
environment variable overrides the default if set.
If you want to use a normal IDE to develop a library, publish it to your local Maven repository, and then load that library into BeakerX, you can, like this:
In [ ]:
%classpath config resolver mvnLocal
That is shorthand for a %classpath config resolver local
magic with a file:
path to the local repository.
If you have painted yourself into a corner, you can clear the contents of the maven cache as follows. This is useful for example if you have locally published non-snapshot artifacts. After resetting the cache, you will be prompted to restart your kernel.
In [ ]:
%classpath reset
In [ ]:
%import com.twosigma.beakerx.widget.IntSlider
w = new IntSlider()
w.value = 60
w
In [ ]:
w2 = new IntSlider()
In [ ]:
%unimport com.twosigma.beakerx.widget.IntSlider
In [ ]:
w3 = new IntSlider()
In [ ]:
%import static java.lang.Math.PI
In [ ]:
PI
More details of the implementation:
In [ ]:
%classpath add jar ../resources/jar/demo.jar
%classpath
5+5
In [ ]:
%classpath
%classpath add jar ../resources/jar/demo.jar
In [ ]:
%classpath add jar ../resources/jar/demo.jar
%classpath
In [ ]:
%import static com.example.Demo.staticTest
In [ ]:
staticTest()
In [ ]:
%import static com.example.Demo.STATIC_TEST_123
In [ ]:
STATIC_TEST_123
In [ ]:
%import static com.example.Demo.*
In [ ]:
STATIC_TEST_123
In [ ]:
staticTest()