Skip to content
Snippets Groups Projects
Commit 9e47bb22 authored by Emmanuel Bruno's avatar Emmanuel Bruno
Browse files

adds a first version of external compilation for annotations.

parent 95bce6dd
Branches
No related tags found
No related merge requests found
......@@ -8,7 +8,9 @@ ENV PLANTUML_SHA1 da1de7f1b3de4c70b2ff501579802085dbc9a05b
USER root
# Install minimal dependencies
RUN apt-get update && apt-get install --yes --no-install-recommends\
RUN --mount=type=cache,target=/var/cache/apt \
rm -f /etc/apt/apt.conf.d/docker-clean &&\
apt-get update && apt-get install -qq --yes --no-install-recommends\
coreutils \
curl \
dnsutils \
......@@ -21,14 +23,16 @@ RUN apt-get update && apt-get install --yes --no-install-recommends\
procps \
tree \
ttf-bitstream-vera \
zsh && \
apt-get clean && rm -rf /var/lib/apt/lists/* && rm -rf /var/cache/apt
zsh \
make latexmk fonts-freefont-otf texlive-latex-extra texlive-fonts-extra texlive-xetex latexmk \
&& rm -rf /var/lib/apt/lists/*
## ZSH
ADD zsh/initzsh.sh /tmp/initzsh.sh
ADD zsh/p10k.zsh $HOME/.p10k.zsh
RUN echo -e "\e[93m**** Install Java Kernel for Jupyter ****\e[38;5;241m" && \
RUN --mount=type=cache,target=/var/cache/buildkit/pip \
echo -e "\e[93m**** Install Java Kernel for Jupyter ****\e[38;5;241m" && \
curl -sL https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip -o /tmp/ijava-kernel.zip && \
unzip /tmp/ijava-kernel.zip -d /tmp/ijava-kernel && \
cd /tmp/ijava-kernel && \
......@@ -57,30 +61,33 @@ RUN echo -e "\e[93m**** Install Java Kernel for Jupyter ****\e[38;5;241m" && \
fix-permissions /home/$NB_USER
## Enable Java Early Access
#COPY kernel.json /opt/conda/share/jupyter/kernels/java/kernel.json
COPY kernel.json /opt/conda/share/jupyter/kernels/java/kernel.json
# Adds IJava Jupyter Kernel Personnal Magics
ADD magics /magics
ENV IJAVA_COMPILER_OPTS="-deprecation -Xlint -XprintProcessorInfo -XprintRounds --enable-preview --release 17"
# ENV IJAVA_COMPILER_OPTS="-deprecation -Xlint -XprintProcessorInfo -XprintRounds --enable-preview --release 17"
ENV IJAVA_CLASSPATH="${HOME}/lib/*.jar:/usr/local/bin/*.jar"
ENV IJAVA_STARTUP_SCRIPTS_PATH="/magics/*"
RUN echo -e "\e[93m**** Installs SDKMan, Java JDKs and Maven3 ****\e[38;5;241m"
# Tool to easily install java dev tools with sdkman
# Install latest java jdk LTS
# Install the latest mvn 3
RUN curl -s "https://get.sdkman.io" | bash && \
RUN --mount=type=cache,target=/opt/sdkmanArchives/ \
echo -e "\e[93m**** Installs SDKMan, Java JDKs and Maven3 ****\e[38;5;241m" && \
curl -s "https://get.sdkman.io" | bash && \
mkdir -p /home/jovyan/.sdkman/archives/ && \
ln -s /opt/sdkmanArchives/ /home/jovyan/.sdkman/archives/ && \
echo "sdkman_auto_answer=true" > $HOME/.sdkman/etc/config && \
source "$HOME/.sdkman/bin/sdkman-init.sh" && \
sdk install java && \
sdk install maven && \
sdk flush && \
# sdk flush && \
groupadd sdk && \
chgrp -R sdk $SDKMAN_DIR &&\
chmod 770 -R $SDKMAN_DIR && \
adduser $NB_USER sdk && \
sdk flush && \
sdk flush broadcast && \
# sdk flush && \
# sdk flush broadcast && \
fix-permissions /home/$NB_USER/.sdkman
RUN echo \
......
......@@ -3,9 +3,10 @@
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
. ${DIR}/env.sh
docker build \
#DOCKER_BUILDKIT=1 docker build \
docker buildx build \
--file Dockerfile \
-t ${BASE}:$SHA \
`[[ "$BRANCH" != "master" ]] && echo -t ${BASE}:$BRANCH` \
`[[ "$BRANCH" == "master" ]] && echo -t ${BASE}:latest` \
`[[ "$BRANCH" == "master" ]] && echo -t ${BASE}:latest` $@ \
.
File added
{
"argv": [
"java",
"-ea",
"-jar",
"/opt/conda/share/jupyter/kernels/java/ijava-1.3.0.jar",
"{connection_file}"],
"display_name": "Java",
"env": {"IJAVA_COMPILER_OPTS":"--enable-preview --release 17"},
"interrupt_mode": "message",
"language": "java"
}
......@@ -12,6 +12,14 @@ import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.CompilationUnit;
import javax.tools.JavaFileObject;
import io.github.spencerpark.jupyter.kernel.magic.registry.MagicsArgs;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import javax.tools.StandardJavaFileManager;
import java.util.stream.Collectors;
import io.github.classgraph.ClassGraph;
/**
%%javasrcMethodByAnnotationName Test POST
/src/Test.java
......@@ -28,7 +36,7 @@ IJava.getKernelInstance().getMagics().registerCellMagic("javasrcMethodByAnnotati
.filter(m -> m.getAnnotations().stream().anyMatch(a -> a.getNameAsString().equals(annotationName)))
.skip(index)
.findFirst().get().toString();
out = "```java\n"+out+"\n```";
out = "```Java\n"+out+"\n```";
display(out,"text/markdown");
return out;
});
......@@ -47,7 +55,7 @@ IJava.getKernelInstance().getMagics().registerCellMagic("javasrcMethodByName", (
.getMethodsByName(methodName)
.get(index)
.toString();
out = "```java\n"+out+"\n```";
out = "```Java\n"+out+"\n```";
display(out,"text/markdown");
return out;
});
......@@ -62,7 +70,77 @@ IJava.getKernelInstance().getMagics().registerCellMagic("javasrcClassByName", (a
CompilationUnit cu = StaticJavaParser.parse(Files.readString(Path.of(filename)));
String out = cu.getClassByName(className).get()
.toString();
out = "```java\n"+out+"\n```";
out = "```Java\n"+out+"\n```";
display(out,"text/markdown");
return out;
});
/**
%%compile fr/univtln/bruno/Test.java
package fr.univtln.bruno;
import lombok.*;
@Setter
@Getter
@ToString
@AllArgsConstructor(staticName="of")
@NoArgsConstructor
public class Test {
private int x;
private int y;
private int z;
}
*/
IJava.getKernelInstance().getMagics().registerCellMagic("compile",(args,body)->{
try{
//We parse the magics arguments
MagicsArgs schema=MagicsArgs.builder()
.required("filePath")
//.optional("x")
//.keyword("from", MagicsArgs.KeywordSpec.ONCE)
//.flag("verbose", 'v',"true")
.onlyKnownKeywords()
.onlyKnownFlags()
.build();
Map<String, List<String>>params=schema.parse(args);
//display(params);
Map<String, List<String>>vals=schema.parse(args);
//We create the tmp dit if necessary
// File tempDirectory = Files.createTempDirectory("jupyterJava").toFile();
File tempDirectory=new File("/tmp/jupyterJava");
String filename = vals.get("filePath").get(0);
File file=new File(tempDirectory,filename);
Files.createDirectories(file.getParentFile().toPath());
BufferedWriter writer=new BufferedWriter(new FileWriter(file));
writer.write(body);
writer.close();
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null);
Iterable<?extends JavaFileObject> compilationUnits1=
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File[]{file}));
//We use the ClassGraph reflection API
List<URI> classpath = new ClassGraph().getClasspathURIs();
List<String> optionList=new ArrayList<String>();
optionList.addAll(Arrays.asList("-cp",classpath.stream().map(URI::toString).collect(Collectors.joining(":"))));
optionList.addAll(Arrays.asList("--enable-preview","--release","19"));
compiler.getTask(null,fileManager,null,optionList,null,compilationUnits1).call();
//display("Compilation of "+file);
IJava.getKernelInstance().addToClasspath(tempDirectory.toString());
//display("added to classpath "+tempDirectory.toString());
//String className=filename.substring(0,filename.lastIndexOf(".")).replace("/",".");
//display("Loading class "+className);
//ClassLoader parentClassloader=((URLClassLoader)(Thread.currentThread().getContextClassLoader()));
//Thread.currentThread().setContextClassLoader(URLClassLoader.newInstance(new URL[]{tempDirectory.toURI().toURL()}, parentClassloader));
//URLClassLoader.newInstance(new URL[]{tempDirectory.toURI().toURL()}, parentClassloader).loadClass(className);
//parentClassloader.loadClass(className);
//display("Loaded");
} catch(IOException e){ throw new RuntimeException(e);}
return "ok";
});
......@@ -5,11 +5,11 @@ WORKDIR=$HOME/JUPYTER_WORK_DIR
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
. ${DIR}/env.sh
docker run --rm \
docker run --rm -it \
--name ${PWD##*/} \
--volume $WORKDIR:/home/jovyan/work \
--publish 8888:8888 \
--env NB_UID=$UID \
--env JUPYTER_ENABLE_LAB=yes \
${BASE}:$SHA
${BASE}:$SHA $@
#--env CHOWN_HOME_OPTS='-R' --env CHOWN_HOME=yes \
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment