AnyChart / export-server

Export Server is a Java based server intended for exporting charts in .pdf, .jpg, .png, .svg, .csv, .xslx, .json and .xml formats
http://export.anychart.com/status
Apache License 2.0
20 stars 6 forks source link

Java 11 compatibility #4

Open djechelon opened 2 years ago

djechelon commented 2 years ago

I am trying to build a Docker image of the Anychart server based on Java 11, which is LTS and better suited for security-critical scenarios unlike Java 8.

Here is my Dockerfile

FROM ubuntu AS phantomjs

RUN apt update && apt install wget -y

RUN wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
RUN tar -xjf phantomjs-2.1.1-linux-x86_64.tar.bz2

#RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-linux64.tar.gz
#RUN tar -zxf geckodriver-v0.30.0-linux64.tar.gz

#RUN wget https://chromedriver.storage.googleapis.com/94.0.4606.41/chromedriver_linux64.zip
#RUN tar -zxf chromedriver_linux64.zip

RUN wget https://static.anychart.com/cdn/export-server/export-server.jar
RUN wget https://repo1.maven.org/maven2/xerces/xercesImpl/2.12.2/xercesImpl-2.12.2.jar
RUN wget https://github.com/AnyChart/export-server/blob/master/lib/org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
RUN wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar
RUN wget https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-runtime/3.0.2/jaxb-runtime-3.0.2.jar
RUN wget https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/3.0.1/jakarta.xml.bind-api-3.0.1.jar
#RUN wget http://www.jabylon.org/maven/org/eclipse/wst/xml/xpath2/processor/2.1.100/processor-2.1.100.jar

FROM openjdk:11-jre-slim

COPY --from=phantomjs /phantomjs-2.1.1-linux-x86_64 /usr/lib/
COPY --from=phantomjs /*.jar /app/
COPY settings.toml /app/
RUN ln -s /usr/lib/phantomjs-2.1.1-linux-x86_64 /usr/lib/phantomjs
RUN ln -s /usr/lib/phantomjs/bin/phantomjs /usr/bin/phantomjs

WORKDIR /app

CMD java -Dphantomjs.binary.path=/usr/bin/phantomjs -jar /app/export-server.jar -C /app/settings.toml

settings.toml

# can be "server" or "cmd"
mode = "server"
engine = "phantom"

[server]
port = 8081
host = "127.0.0.1"
allow-scripts-executing = true
log = "/var/log/export-server.log"

[server.sharing]
# MySQL settings
#port = 3306
#db = "shared_db"
#user = "export_server_user"
#password = "export_server_password"

[server.sharing.twitter]
# settings from twitter app settings for sharing in Twitter
#key = "key"
#secret = "secret"
#callback = "http://example.com/sharing/twitter_oauth"

The build succeeds, but I get a class error on startup

Exception in thread "main" java.lang.ExceptionInInitializerError

at java.base/java.lang.Class.forName0(Native Method)

at java.base/java.lang.Class.forName(Unknown Source)

at clojure.lang.RT.classForName(RT.java:2168)

at clojure.lang.RT.classForName(RT.java:2177)

at clojure.lang.RT.loadClassForName(RT.java:2196)

at clojure.lang.RT.load(RT.java:443)

at clojure.lang.RT.load(RT.java:419)

at clojure.core$load$fn__5677.invoke(core.clj:5893)

at clojure.core$load.invokeStatic(core.clj:5892)

at clojure.core$load.doInvoke(core.clj:5876)

at clojure.lang.RestFn.invoke(RestFn.java:408)

at clojure.core$load_one.invokeStatic(core.clj:5697)

at clojure.core$load_one.invoke(core.clj:5692)

at clojure.core$load_lib$fn__5626.invoke(core.clj:5737)

at clojure.core$load_lib.invokeStatic(core.clj:5736)

at clojure.core$load_lib.doInvoke(core.clj:5717)

at clojure.lang.RestFn.applyTo(RestFn.java:142)

at clojure.core$apply.invokeStatic(core.clj:648)

at clojure.core$load_libs.invokeStatic(core.clj:5774)

at clojure.core$load_libs.doInvoke(core.clj:5758)

at clojure.lang.RestFn.applyTo(RestFn.java:137)

at clojure.core$apply.invokeStatic(core.clj:650)

at clojure.core$use.invokeStatic(core.clj:5860)

at clojure.core$use.doInvoke(core.clj:5860)

at clojure.lang.RestFn.invoke(RestFn.java:436)

at export_server.core$loading__5569__auto____4031.invoke(core.clj:1)

at export_server.core__init.load(Unknown Source)

at export_server.core__init.<clinit>(Unknown Source)

at java.base/java.lang.Class.forName0(Native Method)

at java.base/java.lang.Class.forName(Unknown Source)

at clojure.lang.RT.classForName(RT.java:2168)

at clojure.lang.RT.classForName(RT.java:2177)

at clojure.lang.RT.loadClassForName(RT.java:2196)

at clojure.lang.RT.load(RT.java:443)

at clojure.lang.RT.load(RT.java:419)

at clojure.core$load$fn__5677.invoke(core.clj:5893)

at clojure.core$load.invokeStatic(core.clj:5892)

at clojure.core$load.doInvoke(core.clj:5876)

at clojure.lang.RestFn.invoke(RestFn.java:408)

at clojure.lang.Var.invoke(Var.java:379)

at clojure.lang.Util.loadWithClass(Util.java:250)

at export_server.core.<clinit>(Unknown Source)

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter

at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)

at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)

at java.base/java.lang.ClassLoader.loadClass(Unknown Source)

at java.base/java.lang.Class.forName0(Native Method)

at java.base/java.lang.Class.forName(Unknown Source)

at clojure.lang.RT.classForName(RT.java:2168)

at clojure.lang.RT.classForNameNonLoading(RT.java:2181)

at org.httpkit.server$loading__5569__auto____5568.invoke(server.clj:1)

at org.httpkit.server__init.load(Unknown Source)

at org.httpkit.server__init.<clinit>(Unknown Source)

... 42 more

I tried to add as many XML jars as possible to support Java 11, in particular from this discussion. But same error.

Could you advise on running Anychart server on a newer Java version?

Shestac92 commented 2 years ago

@djechelon Unfortunately, the export server is compatible with Java 8 only. Version 11 is not supported.

djechelon commented 2 years ago

Unfortunately I'm not an expert of Clojure, but very experienced in Java. Would you accept help from community members? I am available to provide help.

Java version compatibility is mainly a cybersecurity issue. Java 8 has gone EOL since long, and it is advisable to switch to a newer version, possibly LTS.

In my case, the Anychart http server is jailed into a local container network, so I already did my job of preventing attacks from the external. But in case the server is to be exposed over the internet, a potential vulnerability in Java 8 (which won't likely be fixed) could be used to make harm.

I could personally call it a day and go live to production with my super-jailed Docker image.

Or...... I could say that the XML error is caused by some Java-XML packages, part of Java EE specifications, dropped out of the standard JRE, causing major compatibility issues with older projects.

There are two simple ways to fix this kind of problems in Java applications:

I'll be glad to contribute up to my best