java - 我如何知道应该将哪个模块导入 java 运行时映像?
问题描述
我在 java 运行时映像中运行我的简单应用程序,所以我编写了一个 dockerfile 来创建一个 java 运行时映像并基于它构建一个 docker 映像。但是当我启动它时,抛出了 ClassNotFoundException 异常。
https://docs.oracle.com/en/java/javase/11/docs/api/java.xml/org/xml/sax/SAXNotRecognizedException.html 这个类是在 java.xml 模块中定义的,所以我添加了这个模块在我的 java 运行时映像中。
这是我的码头文件:
FROM openjdk:oracle as packager
ENV JAVA_MINIMAL="/opt/java-minimal"
RUN jlink \
--verbose \
--add-modules \
java.xml \
--compress 2 \
--strip-debug \
--no-header-files \
--no-man-pages \
--output "$JAVA_MINIMAL"
FROM oraclelinux:7-slim
ENV JAVA_HOME "/opt/java-minimal"
ENV PATH $JAVA_HOME/bin:$PATH
ENV DATA_CONFIG /dataconfig
ENV DATA_OUTPUT /dataconfig
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY "target/jmtool.cli-1.0-SNAPSHOT.jar" "/app/app.jar"
COPY "target/dependency" "/app/dependency"
WORKDIR /app
ENTRYPOINT ["java", "-p", "app.jar:dependency", "-m", "jmtool.cli/jmtool.cli.Entrance"]
这是整个错误跟踪堆栈。
Exception in thread "main" java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecognizedException
at jmtool.base@1.0-SNAPSHOT/jmtool.base.config.ExportConfigLoader.loadConfig(ExportConfigLoader.java:37)
at jmtool.cli@1.0-SNAPSHOT/jmtool.cli.Entrance.rewriteConfig(Entrance.java:79)
at jmtool.cli@1.0-SNAPSHOT/jmtool.cli.Entrance.doCommand(Entrance.java:73)
at jmtool.cli@1.0-SNAPSHOT/jmtool.cli.Entrance.main(Entrance.java:51)
Caused by: java.lang.ClassNotFoundException: org.xml.sax.SAXNotRecognizedException
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)
解决方案
推荐阅读
- python - 导入包时找不到模块。它肯定安装在计算机上。我已经尝试了很多东西,但没有一个奏效
- ios - React 本机曲目播放器无法将歌曲添加到播放列表
- python - 运行 Cython 安装会生成不需要的文件
- python - 请求值低于图像下限
- c# - 如何使 NavigationView 的内容适合屏幕
- python - 创建具有向后兼容性的包
- javascript - 负载中的 Base64string 大小太大
- java - 从java中的数据集中删除一个实例
- c++ - “if root == NULL”和“if !root”之间的区别
- php - 为什么 Bit.ly v4 API 返回 INVALID_CONTENT_TYPE_HEADER?