Support occlum font for java
This commit is contained in:
parent
28f47dacce
commit
7eb132c2b2
23
demos/font/font_support_for_java/Dockerfile
Normal file
23
demos/font/font_support_for_java/Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
FROM alpine:3.12
|
||||||
|
|
||||||
|
ENV JAVA_HOME="/usr/lib/jvm/default-jvm/"
|
||||||
|
|
||||||
|
RUN echo -e "https://mirrors.ustc.edu.cn/alpine/v3.12/main\nhttps://mirrors.ustc.edu.cn/alpine/v3.12/community" > /etc/apk/repositories; \
|
||||||
|
apk add openjdk11
|
||||||
|
|
||||||
|
# Has to be set explictly to find binaries
|
||||||
|
ENV PATH=$PATH:${JAVA_HOME}/bin
|
||||||
|
|
||||||
|
ENV GRADLE_VERSION 6.6
|
||||||
|
|
||||||
|
# get gradle and supporting libs
|
||||||
|
RUN apk -U add --no-cache curl; \
|
||||||
|
curl https://downloads.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip > gradle.zip; \
|
||||||
|
unzip gradle.zip; \
|
||||||
|
rm gradle.zip; \
|
||||||
|
apk del curl; \
|
||||||
|
apk update && apk add --no-cache libstdc++ && rm -rf /var/cache/apk/* && apk add --update ttf-dejavu fontconfig
|
||||||
|
|
||||||
|
COPY simsun.ttf /usr/share/fonts/simsun/simsun.ttf
|
||||||
|
|
||||||
|
ENV PATH=${PATH}:/gradle-${GRADLE_VERSION}/bin
|
35
demos/font/font_support_for_java/README.md
Normal file
35
demos/font/font_support_for_java/README.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Make Occlum support font
|
||||||
|
|
||||||
|
This project demonstrates how Occlum support font with a Java demo in SGX enclaves.
|
||||||
|
|
||||||
|
# About JDK
|
||||||
|
|
||||||
|
Both the unmodified [OpenJDK 11](https://hg.openjdk.java.net/portola/jdk11), which is imported from Alpine Linux, and the [Alibaba Dragonwell](https://github.com/alibaba/dragonwell11/tree/dragonwell-for-enclave), which is a downstream version of OpenJDK, are supported now. We have already installed OpenJDK and Dragonwell while building the Docker image, the OpenJDK is installed at `/opt/occlum/toolchains/jvm/java-11-openjdk`, and the Dragonwell is installed at `/opt/occlum/toolchains/jvm/java-11-alibaba-dragonwell`.
|
||||||
|
|
||||||
|
Our demos use Dragonwell as the default JDK, you are free to change to OpenJDK by setting the `JAVA_HOME` to point to the installation directory of OpenJDK and copying it into Occlum instance.
|
||||||
|
|
||||||
|
## Demo: Java excel file writting with Poi
|
||||||
|
|
||||||
|
We provide a excel file writting demo to show how to make occlum support font inside SGX enclaves.
|
||||||
|
|
||||||
|
### Create demo and build it
|
||||||
|
|
||||||
|
Excel writting demo is created in create_java_font_app.sh, and the script also creates a build.gradle to build demo. Then a docker container is created to
|
||||||
|
build the demo and we will get a fat jar file. The docker container is based on Alpine, we will collect all dependency libs and font in document font-lib
|
||||||
|
from the container.
|
||||||
|
|
||||||
|
### Run demo in Occlum container
|
||||||
|
|
||||||
|
Create occlum instance and copy all libs into occlum image which font dependence in occlum container, then build the occlum image and run the demo.
|
||||||
|
|
||||||
|
### How to Run
|
||||||
|
|
||||||
|
Step 1: Create and build demo, also collect font dependency occlum needs
|
||||||
|
|
||||||
|
./create_java_font_app.sh
|
||||||
|
|
||||||
|
Step 2: Create occlum instance and run the demo in occlum's latest docker image release
|
||||||
|
|
||||||
|
docker run -it --device /dev/isgx --rm -v `pwd`:`pwd` -w `pwd` occlum/occlum:0.16.0-ubuntu18.04 `pwd`/run_java_font_app_internal.sh
|
||||||
|
|
||||||
|
Step 3: To check whether it works, a Demo.xlsx file should be created in occlum image host path.
|
13
demos/font/font_support_for_java/build_java_font_app.sh
Executable file
13
demos/font/font_support_for_java/build_java_font_app.sh
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
workpath=`pwd`
|
||||||
|
|
||||||
|
cd ./poi-excel-demo && gradle build customFatJar && cd ../
|
||||||
|
|
||||||
|
mkdir -p font-lib/etc && cp -r /etc/fonts ./font-lib/etc
|
||||||
|
mkdir -p font-lib/lib && cp -d /lib/libuuid.so.1* ./font-lib/lib
|
||||||
|
mkdir -p font-lib/usr/lib && cp -d /usr/lib/libbz2.so.1* ./font-lib/usr/lib && cp -d /usr/lib/libbrotlicommon.so.1* ./font-lib/usr/lib && cp -d /usr/lib/libbrotlidec.so.1* ./font-lib/usr/lib && \
|
||||||
|
cp -d /usr/lib/libexpat.so.1* ./font-lib/usr/lib && cp -d /usr/lib/libfontconfig.so.1* ./font-lib/usr/lib && cp -d /usr/lib/libfreetype.so.6* ./font-lib/usr/lib && \
|
||||||
|
cp -d /usr/lib/libpng16.so.16* ./font-lib/usr/lib
|
||||||
|
mkdir -p font-lib/usr/share && cp -r /usr/share/fontconfig ./font-lib/usr/share && cp -r /usr/share/fonts ./font-lib/usr/share
|
98
demos/font/font_support_for_java/create_java_font_app.sh
Executable file
98
demos/font/font_support_for_java/create_java_font_app.sh
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_NAME=build_java_font_app.sh
|
||||||
|
# 1. Create the poi demo with font
|
||||||
|
demopath=`pwd`
|
||||||
|
rm -rf poi-excel-demo && mkdir poi-excel-demo && cd $_
|
||||||
|
mkdir -p src/main/java && cd $_
|
||||||
|
|
||||||
|
echo '
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFRow;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFFont;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFCell;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
public class SXSSFWriteDemoTwo {
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
// 数据源
|
||||||
|
List<String[]> data = new ArrayList<>();
|
||||||
|
data.add(new String[]{"学号", "姓名", "性别", "专业"});
|
||||||
|
data.add(new String[]{"1001", "小白", "女", "计算机科学与技术"});
|
||||||
|
data.add(new String[]{"1002", "小黑", "男", "软件工程"});
|
||||||
|
// 关闭自动转移(内存向硬盘)
|
||||||
|
SXSSFWorkbook swb = new SXSSFWorkbook(-1);
|
||||||
|
// 创建sheet
|
||||||
|
SXSSFSheet sheet = swb.createSheet("Demo");
|
||||||
|
// 设置font字体
|
||||||
|
XSSFFont font = (XSSFFont) swb.createFont();
|
||||||
|
font.setFontName("宋体");
|
||||||
|
CellStyle cellFormat = swb.createCellStyle();
|
||||||
|
cellFormat.setFont(font);
|
||||||
|
for (int i = 0; i < data.size(); i++) {
|
||||||
|
if (0 != i && 0 == i % 1000) {
|
||||||
|
// 手动转移(内存向硬盘)
|
||||||
|
sheet.flushRows(1000);
|
||||||
|
}
|
||||||
|
// 创建行
|
||||||
|
SXSSFRow row = sheet.createRow(i);
|
||||||
|
String[] content = data.get(i);
|
||||||
|
for (int j = 0; j < content.length; j++) {
|
||||||
|
// 创建单元格
|
||||||
|
if (0 != i && 0 == j) {
|
||||||
|
SXSSFCell c = row.createCell(j);
|
||||||
|
c.setCellStyle(cellFormat);
|
||||||
|
c.setCellValue(Double.valueOf(content[j]));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SXSSFCell c = row.createCell(j);
|
||||||
|
c.setCellStyle(cellFormat);
|
||||||
|
c.setCellValue(content[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 生成Excel
|
||||||
|
FileOutputStream out = new FileOutputStream("/host/Demo.xlsx");
|
||||||
|
swb.write(out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}' > SXSSFWriteDemoTwo.java
|
||||||
|
|
||||||
|
cd $demopath/poi-excel-demo
|
||||||
|
|
||||||
|
# 2. Create gradle project
|
||||||
|
echo "
|
||||||
|
apply plugin: 'java'
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
task customFatJar(type: Jar) {
|
||||||
|
manifest {
|
||||||
|
attributes 'Main-Class': 'SXSSFWriteDemoTwo'
|
||||||
|
}
|
||||||
|
baseName = 'SXSSFWriteDemoTwo'
|
||||||
|
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
|
||||||
|
with jar
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
compile 'org.apache.poi:poi:3.17'
|
||||||
|
compile 'org.apache.poi:poi-ooxml:3.17'
|
||||||
|
}" > build.gradle
|
||||||
|
|
||||||
|
cd $demopath
|
||||||
|
|
||||||
|
rm -rf SimSun.ttf && wget http://d.xiazaiziti.com/en_fonts/fonts/s/SimSun.ttf && mv SimSun.ttf simsun.ttf
|
||||||
|
|
||||||
|
docker images | grep occlum-font &> /dev/null
|
||||||
|
if [ $? -ne 0 ]
|
||||||
|
then
|
||||||
|
echo 'docker build occlum-font:v1 image'
|
||||||
|
docker build -t occlum-font:v1 .
|
||||||
|
else
|
||||||
|
echo 'docker image occlum-font:v1 exist'
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker run -it --rm -v `pwd`:`pwd` -w `pwd` --network host --entrypoint=/bin/sh occlum-font:v1 `pwd`/$SCRIPT_NAME
|
54
demos/font/font_support_for_java/run_java_font_app_internal.sh
Executable file
54
demos/font/font_support_for_java/run_java_font_app_internal.sh
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BLUE='\033[1;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
check_file_exist() {
|
||||||
|
file=$1
|
||||||
|
if [ ! -f ${file} ];then
|
||||||
|
echo "Error: cannot stat file '${file}'"
|
||||||
|
echo "Please see README and build it"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
init_instance() {
|
||||||
|
# Init Occlum instance
|
||||||
|
rm -rf occlum_instance && mkdir occlum_instance
|
||||||
|
cd occlum_instance
|
||||||
|
occlum init
|
||||||
|
new_json="$(jq '.resource_limits.user_space_size = "1400MB" |
|
||||||
|
.resource_limits.kernel_space_heap_size="64MB" |
|
||||||
|
.resource_limits.max_num_of_threads = 64 |
|
||||||
|
.process.default_heap_size = "256MB" |
|
||||||
|
.process.default_mmap_size = "1120MB" |
|
||||||
|
.entry_points = [ "/usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin" ] |
|
||||||
|
.env.default = [ "LD_LIBRARY_PATH=/usr/lib/jvm/java-11-alibaba-dragonwell/jre/lib/server:/usr/lib/jvm/java-11-alibaba-dragonwell/jre/lib:/usr/lib/jvm/java-11-alibaba-dragonwell/jre/../lib" ]' Occlum.json)" && \
|
||||||
|
echo "${new_json}" > Occlum.json
|
||||||
|
}
|
||||||
|
|
||||||
|
build_poi_font() {
|
||||||
|
# Copy JVM and JAR file into Occlum instance and build
|
||||||
|
mkdir -p image/usr/lib/jvm
|
||||||
|
cp -r /opt/occlum/toolchains/jvm/java-11-alibaba-dragonwell image/usr/lib/jvm
|
||||||
|
cp /usr/local/occlum/x86_64-linux-musl/lib/libz.so.1 image/lib
|
||||||
|
cp -r /opt/occlum/font-lib/etc image && cp -r /opt/occlum/font-lib/lib/. image/lib && cp -r /opt/occlum/font-lib/usr/. image/usr
|
||||||
|
mkdir -p image/usr/app
|
||||||
|
cp ../${jar_path} image/usr/app
|
||||||
|
occlum build
|
||||||
|
}
|
||||||
|
|
||||||
|
run_poi_font() {
|
||||||
|
jar_path=./poi-excel-demo/build/libs/SXSSFWriteDemoTwo.jar
|
||||||
|
check_file_exist ${jar_path}
|
||||||
|
jar_file=`basename "${jar_path}"`
|
||||||
|
cp -r ./font-lib /opt/occlum
|
||||||
|
/opt/occlum/start_aesm.sh
|
||||||
|
init_instance
|
||||||
|
build_poi_font
|
||||||
|
echo -e "${BLUE}occlum run JVM poi font app${NC}"
|
||||||
|
occlum run /usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin/java -Xmx512m -XX:-UseCompressedOops -XX:MaxMetaspaceSize=64m -Dos.name=Linux -jar /usr/app/SXSSFWriteDemoTwo.jar
|
||||||
|
}
|
||||||
|
|
||||||
|
run_poi_font
|
Loading…
Reference in New Issue
Block a user