java - 如何使用包名为 java 类定义 Dockerfile?
问题描述
我在尝试运行一个具有与之关联的包名称的简单 java 文件时遇到问题。我的文件是:
package com.example.springboot.folder.folder1;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
要编译上面我使用的javac HelloWorld.java
但要运行它,我需要转到 \com 之前的文件夹结构并运行java com.example.springboot.folder.folder1.HelloWorld
它工作正常。
我现在正在尝试使用 dockerfile 构建和运行它,我当前的 docker 文件如下:
FROM alpine
WORKDIR /root/testdir
COPY HelloWorld.java /root/testdir
RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin
RUN javac HelloWorld.java
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
它与 HelloWorld.java 程序处于同一级别
当我尝试使用构建docker build .
和运行使用docker run imageid
时,出现以下错误:
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
任何人都可以帮我解决我可能出错的地方吗?
解决方案
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
您可以简单地调用此命令:CMD java HelloWorld
,将运行您HelloWorld.class
在第一个命令之后生成的文件:RUN javac HelloWorld.java
。
但这不是一个好方法。您应该向您的 Docker 映像提供一个jar
文件,然后调用此命令:CMD ["java", "-jar", "/HelloWorld.jar"]
. 您需要打包您的项目并将其复制到您的 docker 映像中。
推荐阅读
- django - 在一个查询中通过唯一的非主键字段分配外键
- angular - 在子组件属性中更改 @Input() 会阻止父组件的进一步更新
- jquery - selectize.js 多下拉输入位置
- python - 在 python 中处理大型请求响应(JSON 对象数组)
- r - 如何对每组数据框应用函数
- admob - 删除后如何添加admob付款方式?
- arrays - 将 JSON 转换为 Twig 循环数组
- javascript - rel="preload" 如何影响 window.onload?
- php - 如何从现代事件日历插件中获取元数据
- xml - 在 Android Studio 中从图库中将图像片段加载和存储到 SQLite 数据库